1.无名管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。
int fd[2];//0读出,1写入
pipe(fd);
int pid = fork();
if(pid==0){
close(fd[1]);
read(fd[0], buf, len);
}else if(pid>0){
close(fd[0]);
write(fd[1], buf, len);
}
2.高级管道(popen):将另一个程序当做一个新的进程在当前程序进程中启动,则它算是当前程序的子进程,这种方式我们成为高级管道方式。
FILE *fp = popen(cmd, mode);
fread(buf, n, size, fp);
3.有名管道 (named pipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
mkfifo(path,mode);
fd = open(path,mode);
write(fd,xxx);
read(fd,xxx);
4.消息队列( message queue ) : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
int msgget(key_t key,int msgflg);
int msgctl(int msqid,int cmd,struct msqid_ds *buf);
int msgsnd(int msqid,const void *msgp,size_t msgsz,int msgflag);
ssize_t msgrcv(int msqid,void *msgp,size_t msgsz,long msgtyp,int msgflg);
5.信号量( semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
int semget(key_t key, int num_sems, int sem_flags);
struct sembuf{
short sem_num;//除非使用一组信号量,否则它为0
short sem_op;//信号量在一次操作中需要改变的数据,通常是两个数,一个是-1,即P(等待)操作,
//一个是+1,即V(发送信号)操作。
short sem_flg;//通常为SEM_UNDO,使操作系统跟踪信号,
//并在进程没有释放该信号量而终止时,操作系统释放信号量
};
int semop(int sem_id, struct sembuf *sem_opa, size_t num_sem_ops);
union semun{
int val;
struct semid_ds *buf;
unsigned short *arry;
};
int semctl(int sem_id, int sem_num, int command, ...);
6.信号 ( signal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
-->
void (*signal(int signum, void (*handler)(int)))(int);
功能:设置信号对进程的处理方式
参数:
signum:信号
handler:处理方式
SIG_IGN 忽略,当信号产生后对当前进程没有任何影响
SIG_DFL 缺省,按照当前信号默认的方式处理
void (*handler)(int sig) 信号处理函数,自定义函数来处理产生信号之后的过程
sig:调用signal时的第一个参数
返回值:
成功:返回修改之前信号对进程的处理方式
失败:SIG_ERR
//发送信号
int kill(pid_t pid, int sig);//sig包含多种信号
int raise(int sig);
//等待信号
int pause(void);
unsigned int alarm(unsigned int seconds);
7.共享内存( shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。
8.套接字( socket ) : 套解字也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同机器间的进程通信。