Linux下进程见通信(IPC)

来源:互联网 发布:免费录音制作软件 编辑:程序博客网 时间:2024/05/04 17:07
UNIX和SystemV进程间通信方式是Linux进程间通信的主要起源。
进程间通信的主要作用有如下几点:
1.数据传输
2.资源共享
3.事件通知
4.进程控制

常用通信方式有:
1.管道(无名和有名管道
2.信号
3.消息队列
4.共享内存
5.信号量
6.套接字(socket)

无名管道(pipe)
管道,顾名思义即数据流通的载体,就像水管一样。
特点:
1.半双工,数据只能由管道一端流向另一端。
2.父子进程,无名管道只能用于父子进程间通行。
3.无格式数据,数据管道中是比特流的形式,无法传送特定格式的数据。
编程:
1.int pipe(intfildis[2]);           //fildis[0]读,fildis[1]写
2.int read(intfd,void*buf,int size_t size);
3.int write(intfd, void*buf,int size_t size);

有名管道(FIFO)
特点:
1.全双共,两进程均可读写管道。
2.可用于任意进程间通信。
3.数据以比特流形式传输。
4.管道中数据读走后,即被清除;
5.所有操作类似于文件操作。
编程:
1.intaccess(const char*filename,int mode);//F_OK
2.intmkfifo(const char *pathname,mode_t mode);//NON_BLOCK|0666
3.int open(constchar*filename,int flgs);
4.int read(intfd,void*buf,size_t size);
5.int write(intfd,void*buf,size_t size);
6.unlink(constchar*filename);

信号(signal)
特点:
1.用于事件通知;
2.信息量少;
编程:
1.int kill(pid_t pid,intsigno);  //可向其他进程发射信号
2.int raise(int signo);          //父子进程发射信号
3.unsigned int alarm(unsignedint second); //向本进程发射SIGALARM信号;
4.int pause(void);              //向本进程发射SIGPAUSE信号,直至接受到信号
5.void (*singal)(intsigno,void(*func)(int))(int);//添加信号处理函数/SIG_IGN/SIG_DEF

消息队列(message queue)
特点:
1.就是一个消息的链表;
2.消息内容以特定结构体形式加入或移除链表;
3.信息量比信号大,数据可以有各种格式,用结构体中数据域标识数据类型;
编程:
1.key_tfotk(const char*filename,char proj);  //由文件获取key
2.intmsgget(key_t key,int msgflg);             //由key获得msgid,key=IPC_PRIVATE,则创建新队列
                                                          //当key不存在且msgflg=IPC_CREAT|0666,则创建
3.int msgsnd(intmsgid,struct msgbuf*,int msgsz,int msgflg);
4.int msgrcv(intmsgid,struct msgbuf*,int msgsz,int msgtyp,int msgflg);
5.structmsgbuf
{
      int mtyp;
      char data[1];
};

信号量(semaphore)
特点:
1.实质为维护一个标识资源可用的正整数;
2.访问临界资源前,先获取信号两,整数-1;
3.访问结束时,释放信号量,整数+1;
4.标识资源可用性的整数=0使,申请资源的进程将阻塞或获取失败;
5.主要用于保护临界资源;
6.以信号量集合操作为单位。
编程:
1.key_tftok(const char*filename,char proj);
2.intsemget(key_t key,int nsems,intsemflg);//由key获取包含nsems个信号量的信号量集的semid
3.int semctl(intsemid,int semnum,cmd,...);  //控制信号量集合,包括获取/设置semval等,初始化
                                                           //第四个参数由unionsemun给出,联合需自定义
4.unionsemun
{
      intval;
      structsemid_ds *buf;
      structseminfo *_buf;
      ushort*array;
};
5.int semop(intsemid,struct sembuf *sops,int nsems);
6.structsembuf
{
      unsignedshort sem_num; // index in semaphore set
      shortsem_op;                 // -1 or+1 
      intsem_flg;                   // IPC_NOWAIT orSEM_UNDO
};
0 0