C linux中子进程与父进程之间的通信:父进程不阻塞
Posted
技术标签:
【中文标题】C linux中子进程与父进程之间的通信:父进程不阻塞【英文标题】:communication between child and parent processes in C linux: parent process not blocking 【发布时间】:2014-03-19 09:58:52 【问题描述】:我希望父进程和子进程在 C linux 中使用管道进行通信。首先,我希望父母传递一个字符串,然后让孩子承认它。我创建了两个文件描述符。一个用于父到子,即读管道和其他写管道,反之亦然。 问题是它没有将我的数据作为输入。此外,我希望打印一次诸如“输入您的数据”之类的 printf 语句,但由于在 fork 之后,有两个进程,因此它们被显示两次。有什么替代方案吗??
//readpipe[0] = child read
//readpipe[1]= parent write
//writepipe[0]=parent read
//writepipe[1]=child write
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
int main(void)
pid_t pid;
int r;
/* Hope this is big enough. */
char buf[1024];
char cp[50];
char ans;
int readpipe[2];
int writepipe[2];
int a;
int b;
a=pipe(readpipe);
b=pipe(writepipe);
if (a == -1) perror("pipe"); exit(EXIT_FAILURE);
if (b == -1) perror("pipe"); exit(EXIT_FAILURE);
printf("\nSEND SOMETHING TO CHILD PROCESS\t");
scanf(" %c",&ans);
pid=fork();
if(pid==-1)
printf("pid:main");
exit(1);
while(ans=='y' || ans=='Y')
printf("\nEnter data\t"); //printed twice
fgets(cp, 50, stdin); //not taking data
printf("\n%s",cp);
if(pid==0)
//CHILD PROCESS
close(readpipe[1]);
close(writepipe[0]);
read(readpipe[0],buf,sizeof(buf));
printf("\nSENT\n %s",buf);
write(writepipe[1],cp,strlen(cp)+1);
else
//PARENT PROCESS
close(readpipe[0]);
close(writepipe[1]);
write(readpipe[1],cp,strlen(cp)+1);
read(writepipe[0],buf,sizeof(buf));
printf("\nRECEIVED\n %s",buf);
printf("\nSEND SOMETHING TO CHILD PROCESS\t");
scanf(" %c",&ans);
close(readpipe[1]);
close(writepipe[0]);
close(readpipe[0]);
close(writepipe[1]);
return 0;
谢谢:)
【问题讨论】:
只是一个建议。不要尝试从刚刚关闭的管道中读取。close(writepipe[0])
后跟 read(writepipe[0],ch1,sizeof(ch1));
... 不会这么热。
您可能会发现something like this 更容易理解,尤其是在与readpipe
和writepipe
等助记符打架时。
谢谢@WhozCraig。我对我的代码做了一些更改。仍然有2个问题。你能帮帮我吗?非常感谢:)
【参考方案1】:
你的代码有几个问题:
1.
close(writepipe[1]);
你不应该关闭你以后需要的文件描述符。
2.
read(readpipe[0],ch,sizeof(ch));
ch
是NULL
,这意味着你没有分配任何空间让它指向。
3.
ch1="YES";
write(writepipe[1],ch1,sizeof(ch1));
您应该使用strlen(ch)+1
而不是sizeof(ch)
来确定需要写入多少字节。
4.
您的父进程代码中存在类似问题。
这里是基于这个问题中的代码的固定版本:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
int main(void)
pid_t pid;
int r;
/* Hope this is big enough. */
char buf[1024];
char *cp;
int readpipe[2];
int writepipe[2];
int a;
int b;
a=pipe(readpipe);
b=pipe(writepipe);
// check a and b
pid=fork();
// check pid
if(pid==0)
//CHILD PROCESS
close(readpipe[1]);
close(writepipe[0]);
read(readpipe[0],buf,sizeof(buf));
printf("\nREAD = %s",buf);
close(readpipe[0]);
cp="YES\n";
write(writepipe[1],cp,strlen(cp)+1);
close(writepipe[1]);
else
//PARENT PROCESS
close(readpipe[0]);
close(writepipe[1]);
cp="HI!! YOU THERE";
write(readpipe[1],cp,strlen(cp)+1);
close(readpipe[1]);
read(writepipe[0],buf,sizeof(buf));
printf("\nACK RECEIVED %s",buf);
close(writepipe[0]);
return 0;
【讨论】:
非常感谢。这真的很有帮助..:) 我做了一些改动。又是一个问题。你能检查一下吗 @user3436838 这个printf("Enter data\n"); fgets(cp, 50, stdin);
将由父进程和子进程执行。这是新代码的主要问题。以上是关于C linux中子进程与父进程之间的通信:父进程不阻塞的主要内容,如果未能解决你的问题,请参考以下文章
linux vfork的子程序与父进程共享内存,那为啥子进程执行exec就不会覆盖父进程呢?
linux vfork的子程序与父进程共享内存,那为啥子进程执行exec就不会覆盖父进程呢?
Linux 中 Python 父进程和 C 子进程之间的通信