基础进程通信方式

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 ) : 套解字也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同机器间的进程通信。

猜你喜欢

转载自blog.csdn.net/HideInTime/article/details/124745810