Linux中,有关父进程 子进程和进程间管道通信信的C语言问题

嵌入式工程师的成长之路
Linux下的管道和父子进程的应用
//下列代码主要用处是在父进程中写入值,在子进程中读出,再在子进程中写入,在父进程中读出,体验管道的应用
#include&stdio.h&
#include&unistd.h&
#include&sys/types.h&
#include&string.h&
#include&stdlib.h&
int main()
{int fd[2];char buffer[10] = {0};int ret = pipe(fd);if (ret == -1){perror("pipe");}pid_t pid = fork();if ( pid == -1){perror("fork");}if (pid == 0){while(1){read(fd[0], buffer, 10);printf("P buffer = %s\n", buffer);memset(buffer, 0, 10);scanf("%s", buffer);
write(fd[1], buffer, 10);sleep(1);}}else{while (1){scanf("%s", buffer);write(fd[1], buffer, 10);
sleep(1);read(fd[0], buffer, 10);printf("c buffer = %s\n", buffer);}}
没有更多推荐了,管道通信:父进程向子进程发送信息【linux吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:193,138贴子:
管道通信:父进程向子进程发送信息收藏
#include&stdio.h&#include&stdlib.h&#include&unistd.h&#include&string.h&#include&sys/wait.h&int main(int argc,char *argv[]){int pfd[2];pid_pipe(pfd);//创建管道 cpid =fork();//创建进程if(cpid ==0){close(pfd[1]);while((read(pfd[0],&buf,1) &0))write(STDOUT_FILENO,&buf,1);write(STDOUT_FILENO,"\n",1);close(pfd[0]);exit(0);}else if(cpid &0){sleep(5);//即使加了这一句还是会输出abcclose(pfd[0]);write(pfd[1],argv[1],strlen(argv[1]));close(pfd[1]);wait(NULL);exit(0);}return 0;}输入: ./pipetest
(./pipetest是程序编译后的可执行文件 abc是输入参数)输出:abc为什么会有 abc, 按常理,创建进程后,子进程(cpid ==0)先执行,这时候父进程还没有写入数据啊 ?子进程执行完不是已经退出了么 ,为什么还会读到数据输出呢。。。。
苏州G-LAB高端实验室linux认证培训,资深专家小班授课,高端实训器材,实力认证让您快速实现职业蜕变!
竟然没有人知道。。。
管道读不到数据,read 会被阻塞,所以你 sleep 一百年 read 都会等着你的。除非写端被关闭了,这样 read 会读完所有数据后返回 0 代表 EOF,此时循环才退出。
码,回去看
这是刚 fork 完的子进程关闭写端,无法写管道,父进程关闭读端,无法读管道
这几天正在玩进程间通信那,没想到有和我一样的,此帖收藏了
登录百度帐号父进程和多个子进程通信使用Pipe通信问题
[问题点数:40分]
本版专家分:0
结帖率 62.5%
CSDN今日推荐
本版专家分:30260
2008年7月 VC/MFC大版内专家分月排行榜第三2007年11月 VC/MFC大版内专家分月排行榜第三
本版专家分:368866
2017年 总版技术专家分年内排行榜第一
2014年 总版技术专家分年内排行榜第二
2013年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第七
本版专家分:0
本版专家分:4184
本版专家分:41194
2013年2月 C/C++大版内专家分月排行榜第二
2013年3月 C/C++大版内专家分月排行榜第三
本版专家分:0
匿名用户不能发表回复!|
其他相关推荐&nbsp>&nbsp
&nbsp>&nbsp
&nbsp>&nbsp
Linux下C语言进程间管道通信
摘要:Ubuntu16.04LTSgccversion5.4.0关于进程通信通信方式Linux下进程间通信方式有以下几种:无名管道(pipe)和有名管道(FIFO)消息队列共享内存信号量信号(signal)套接字(socket)通信用途进程通信的用途有以下几类:数据传输:一个进程需要将它的数据发送给另一个进程。共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到。通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止
Ubuntu16.04 LTS
gcc version 5.4.0 关于进程通信 通信方式
Linux下进程间通信方式有以下几种: 无名管道(pipe)和有名管道(FIFO) 消息队列 共享内存 信号量 信号(signal) 套接字(socket) 通信用途
进程通信的用途有以下几类: 数据传输:一个进程需要将它的数据发送给另一个进程。 共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到。 通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。 资源共享的同步:多个进程之间共享同样的资源。为了做到这一点,需要内核提供锁和同步机制。 进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的改变状态。
从前没有进程间通信的概念,用了一下午加一晚上的时间才弄懂了无名管道方式,在此记录下来,相关知识点在下方代码中做了详细的注释。 实现代码 #include&unistd.h& // 引入fork()/write()/read()#include&sys/types.h&#include&sys/wait.h& // 以上两个引入wait()#include&stdio.h& #include&stdlib.h& // 引入exit()#define BUFFER_SIZE 50 //定义缓冲区的大小int main(){ int fd[2]; // 管道传输数据所用载体,fd[0]用于读管道,fd[1]用于写管道 char buf[BUFFER_SIZE]; // 存储传输的数据 char s[BUFFER_SIZE]; // 接收传输的数据 pid_t fork_ // 存储fork()的返回值 if(pipe(fd) != 0){ // 创建半双工管道 perror(&pipe&); exit(EXIT_FAILURE); } fork_id = fork(); //创建子进程,在子进程中返回值fork_id的值为0,在父进程中,其值为子进程的ID号 if(fork_id == 0){ // 子进程执行的程序块 printf(&Locate at child process:/nsleep 2s/n&); sleep(2); sprintf(buf, &Process communication --OS homework&); close(fd[0]); // 在子进程中先关闭读管道 write(fd[1], buf, BUFFER_SIZE); // 将数据写入管道 close(fd[1]); // 写入完毕,关闭写管道 exit(EXIT_SUCCESS); // 退出子进程,EXIR_SUCCESS是宏常量0,exit(0)表示程序正常退出 }else{ // 父进程执行的程序块 wait(0); // 等待子进程正常退出,即保证子进程的数据已都写到管道内 // printf(&%s/n&, buf); // 用来证明此处buf与子进程中buf相互独立,没有关联 printf(&Locate at parent process:/n&); close(fd[1]); // 在父进程中先关闭写管道 read(fd[0], s, BUFFER_SIZE); // 读管道内容,s可替换为buf close(fd[0]); // 读取完毕,关闭读管道 printf(&%s/n&, s); // 打印从管道中读到的数据 } return 0;}
以上是的内容,更多
的内容,请您使用右上方搜索功能获取相关信息。
若你要投稿、删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内给你回复。
新用户大礼包!
现在注册,免费体验40+云产品,及域名优惠!
云服务器 ECS
可弹性伸缩、安全稳定、简单易用
&40.8元/月起
预测未发生的攻击
&24元/月起
你可能还喜欢
你可能感兴趣
阿里云教程中心为您免费提供
Linux下C语言进程间管道通信相关信息,包括
的信息,所有Linux下C语言进程间管道通信相关内容均不代表阿里云的意见!投稿删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内答复
售前咨询热线
支持与服务
资源和社区
关注阿里云
International一个关于Linux中的父进程与子进程的问题,求正解~【c语言吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:585,484贴子:
一个关于Linux中的父进程与子进程的问题,求正解~收藏
#include &stdio.h&#include &unistd.h&main(){
pid = fork();
if(pid == 0){
printf("I am child!\n");
printf("I am parent!\n");}不是说父进程结束,子进程一定就会结束的吗?可是这段代码运行显示,父进程结束了,而子进程没有结束。这是为什么?如果把sleep(1)去掉的话,多运行几次也会出现这样的情况。求高手解答这是为什么?
父进程结束 子进程变为孤儿进程
由INIT进程接管
那就是说“父进程结束,子进程也一定结束”不成立了?我好像看到很多资料都说父进程结束,子进程一定会结束的,郁闷~
父进程退出后,会给它的所有子进程发SIGHUP信号,而该信号的默认动作就是退出运行。但是子进程可以修改SIGHUP信号的处理动作,或者屏蔽该信号。而在某些操作系统上,可以设置默认屏蔽该信号的。别看那么多没用的资料,很多都有错误。看一本书就足够了:APUE
噢,知道了,谢谢各位。
子线程是会自动退出滴
登录百度帐号

我要回帖

更多关于 进程管道通信 的文章

 

随机推荐