linux进程间通讯,(父子进程间)
2021/10/26 7:09:47
本文主要是介绍linux进程间通讯,(父子进程间),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
管道通讯(父读子写)
互斥:任何时刻只能有一个人正在使用某种资源
管道内部自动提供了互斥与同步机制
如果写端关闭,读端就会read返回值0,代表文件结束
如果打开文件的进程退出,文件也会被释放
文件的生命周期随进程
<管道的流式服务>
管道是半双工,就是数据只可以向一个方向流动
匿名管道,适合具有血缘关系的进程进行进程间通讯
read :没有内容挂起
write:没有空间挂起
如若管道没有父进程读,就会读文件错误。
read关闭,一直写,写方(child)被操作系统杀掉,写入无意义
linux实现父子管道通讯的代码如下(父读子写)
1 #include <stdio.h> 2 #include <unistd.h> 3 #include <sys/types.h> 4 #include <sys/wait.h> 5 #include <string.h> 6 #include <stdlib.h> 7 8 int main() 9 { 10 int fd[2]={0}; 11 12 if(pipe(fd)<0) //创建读写的文件窗口 13 { 14 printf("pipe error!\n"); 15 return 1; 16 } 17 18 //printf("fd[0]:%d\n",fd[0]); 19 //printf("fd [1]:%d\n",fd[1]); 20 21 pid_t id=fork(); 22 if(id==0) 23 { 24 //child 25 close(fd[0]); 26 const char* str="hello,i am child!"; 27 int count=10; 28 while(count) 29 { 30 write(fd[1],str,strlen(str)); 31 count--; 32 sleep(1); 33 } 34 exit(0); 35 } 36 37 //father 38 close(fd[1]); 39 char buff[64]; 40 while(1) 41 { 42 ssize_t s=read(fd[0],buff,sizeof(buff)); //s是实际读到的字节数 读的时候,因为管道里面的互斥,写一个读一个,所以感觉就/有sleep 43 if(s>0) 44 { 45 buff[s]='\0'; 46 printf("child send to father# %s\n",buff); 47 } 48 else if(s==0) //如果写端关闭,读端自动读到0值 49 { 50 printf("read file end!\n"); 51 break; 52 } 53 else 54 { 55 printf("read error!\n"); 56 break; 57 } 58 } 59 waitpid(id,NULL,0); 60 return 0; 61 }
这篇关于linux进程间通讯,(父子进程间)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-12如何创建可引导的 ESXi USB 安装介质 (macOS, Linux, Windows)
- 2024-11-08linux的 vi编辑器中搜索关键字有哪些常用的命令和技巧?-icode9专业技术文章分享
- 2024-11-08在 Linux 的 vi 或 vim 编辑器中什么命令可以直接跳到文件的结尾?-icode9专业技术文章分享
- 2024-10-22原生鸿蒙操作系统HarmonyOS NEXT(HarmonyOS 5)正式发布
- 2024-10-18操作系统入门教程:新手必看的基本操作指南
- 2024-10-18初学者必看:操作系统入门全攻略
- 2024-10-17操作系统入门教程:轻松掌握操作系统基础知识
- 2024-09-11Linux部署Scrapy学习:入门级指南
- 2024-09-11Linux部署Scrapy:入门级指南
- 2024-08-21【Linux】分区向左扩容的方法