加入收藏 | 设为首页 | 会员中心 | 我要投稿 西安站长网 (https://www.029zz.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

TCP/IP网络编程之进程与间通信

发布时间:2019-11-09 23:10:26 所属栏目:教程 来源:Hu先生Linux后台开发
导读:副标题#e# 进程间通信基本概念 进程间通信意味着两个不同进程间可以交换数据,为了完成这一点,操作系统中应提供两个进程可以同时访问的内存空间。但我们知道,进程具有完全独立的内存结构,就连通过fork函数创建的子进程也不会和父进程共享内存,因此,进

编译pipe2.c并运行

  1. # gcc pipe2.c -o pipe2 
  2. # ./pipe2 
  3. Parent proc output: Who are you? 
  4. Child proc output: Thank you for your message 

运行结果和我们设想一致,不过如果尝试将18行的代码注释后再运行,虽然这行代码只将运行时间延迟了两秒,但一旦注释便会引发错误,是什么原因呢?

向管道传递数据时,先读的进程会把数据取走。简言之,数据进入管道后成为无主数据,也就是通过read函数先读取数据的进程将得到数据,即使该进程将数据传到了管道。因此,注释第18行将产生问题,在第19行,子进程将读回自己在第17行向管道发送的数据。结果父进程调用read函数后将无限期等待数据进入管道。

从上述示例可以看到,只用一个管道进行双向通信并非易事,为了简化在进行双向通信时,既然一个管道很难完成的任务,不如就让两个管道来一起完成?因此创建两个管道,各自负责不同的数据流动即可。其过程如图1-4所示

TCP/IP网络编程之进程与间通信

图1-4 双向通信模型2

由图1-4可知,使用两个管道可以解决单单通过一个管道来进行双向通信的麻烦,下面采用上述模型来改进pipe2.c。

pipe3.c

  1. #include <stdio.h> 
  2. #include <unistd.h> 
  3. #define BUF_SIZE 30 
  4. int main(int argc, char *argv[]) 
  5. int fds1[2], fds2[2]; 
  6. char str1[] = "Who are you?"; 
  7. char str2[] = "Thank you for your message"; 
  8. char buf[BUF_SIZE]; 
  9. pid_t pid; 
  10. pipe(fds1), pipe(fds2); 
  11. pid = fork(); 
  12. if (pid == 0) 
  13. write(fds1[1], str1, sizeof(str1)); 
  14. read(fds2[0], buf, BUF_SIZE); 
  15. printf("Child proc output: %s n", buf); 
  16. else 
  17. read(fds1[0], buf, BUF_SIZE); 
  18. printf("Parent proc output: %s n", buf); 
  19. write(fds2[1], str2, sizeof(str2)); 
  20. sleep(3); 
  21. return 0; 
  • 第13行:创建两个管道
  • 第17、33行:子进程可以通过数组fds1指向的管道向父进程传输数据
  • 第18、25行:父进程可以通过数组fds2指向的管道向子进程传输数据
  • 第26行:没有太大的意义,只是为了延迟父进程终止的插入的代码

(编辑:西安站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读