进程间通信的7种方式:共享文件、管道、消息队列、共享内存、套接字(附测试代码)

本文总结了Linux进程间通信的7种方式,包括共享文件、匿名管道、有名管道、消息队列、共享内存、信号量和套接字。每种方式都有其特点和使用场景,详细代码可参考链接。共享文件可能导致读写同步问题,匿名管道和有名管道仅适用于有血缘关系的进程,消息队列、共享内存和信号量可用于无血缘关系进程间的通信,套接字则适用于远程通信。
摘要由CSDN通过智能技术生成

Linux进程间通信几种方式总结

面试过程中Linux进程间通信作为基础知识经常会被问道,今天就在这里总结一下。Linux进程间通信常用的有7种,分别是1共享文件、2匿名管道pipe、3有名管道fifo、4消息队列、5共享内存、6信号量、7套接字Socket。现在我们就每种的使用方式和特点简单总结一下。详细代码 https://github.com/Kunpeng1989/IPC    也可关注下边公众号

  1. 共享文件

两个进程可以通过共享文件的方式进行通信,即一个进程在文件中写入消息,另外一个进程从文件中读出信息。这两个进程有无血缘关系均可以。但是通过共享同一个文件进行进程间通信的缺点是,两个进程的读写同步问题,即一个进程写的慢另外一个进程读的快的时候会读不到内容。示例代码如下:

int main(int argc, const char* argv[]){

       int fd = open("My_file", O_CREAT | O_RDWR,0664);

       if(-1 == fd){

              perror("open My_file error!");

              exit(1);

       }

 

       pid_t pid = fork();//创建子进程

       if(-1 == pid){

              perror("fork error!");

              exit(1);

       }

 

       if(pid > 0){ //父进程写

              char *temp = "The first test IPC msg by file is successfuly!\n";

              write(fd, temp, strlen(temp)+1);

              close(fd);

       }else if(0 == pid){ //子进程读

              sleep(1); //睡眠1秒的原因是为了保证此时父进程完成写操作。

              char read_buf[1024];

              lseek(fd, 0, SEEK_SET); //保证文件指针在文件头部

              int len = read(fd, read_buf, sizeof(read_buf));

              printf("%s\n",read_buf);

              close(fd);

       }

       return 0;

}

  1. 匿名管道pipe

匿名管道pipe的实质是内核的缓冲区,它不占用磁盘空间。 一个pipe分为读写两部分,有读和写两个文件描述符,pipe是半双工的一个进程写的时候要把它的读端文件描述符关掉,读的时候要把他的写端文件描述符关掉。pipe默认是阻塞的,写端进程没有写入数据的时候读端进程不用再刻意sleep去等待,而是一直阻塞在那里等待直到写端进程写入。pipe实现是以环形队列形式实现的,所以数据只能读一次(两个进程只有一个进程能从pipe中读消息,读完后队列中这条消息就没有了。pipe在进程结束时有系统回收。匿名管道特点是只能进行有血缘关系的进程间通信,没有血缘关系的进程间无法使用pipe进行通信。示例代码如下:

int main(int argc, const char* argv[]){

       int fd[2]={0};

       int ret = pipe (fd);//fd[0]为读端,fd[1]为写端

       if(-1 == ret){

              perror("pipe error!");

              exit(1);   

       }

 

       pid_t pid = fork();//创建子进程

       if(-1 == pid){

              perror("fork error!");

              exit(1);

       }

 

       if(pid > 0){ //父进程写,关闭读端

              close(fd[0]);

              char *temp = "The first test IPC msg by pipe is successfuly!\n";

              write(fd[1], temp, strlen(temp)+1);

              close(fd[1]);

       }else if(0 == pid){ //子进程读,关闭写端   

              close(fd[1]);

              char read_buf[1024];           

              int len = read

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值