[英]communication between child and parent processes in C linux: parent process not blocking
我希望父进程和子进程在C linux中使用管道进行通信。 首先,我希望父母传递一个字符串,然后让孩子传递它。 我创建了两个文件描述符。 一个用于父级到子级,即readpipe和其他writepipe,反之亦然。 问题是它没有将我的数据作为输入。 我也希望将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;
}
谢谢 :)
您的代码中存在一些问题:
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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.