我正在尝试创建一个双向管道,父进程向子进程发送n个数字(int类型),子进程将它们翻倍后返回。但我无法找出错误在哪里?
我在父进程中扫描数字n并通过fd1[1]发送它,然后继续将这些n个数字发送给子进程进行翻倍。
在子进程中,我读取数字n,并对每个读取的数字进行翻倍并发送回去。
int main(){
int pid,n,c,p,k,nbread;
char buf1[2], buf2[2];
int fd1[2], fd2[2];
pipe(fd1);
pipe(fd2);
pid=fork();
if(pid==0){
close(fd1[1]);
close(fd2[0]);
read(fd1[0],buf2,sizeof(int));
n = atoi(buf2);
for(int i = 0; i<n;i++){
nbread = read(fd1[0],buf2,sizeof(int));
sleep(3);
if(nbread == -1)
exit(1);
c = atoi(buf2);
c = c*2;
sprintf(buf2,"%d",c);
write(fd2[1],buf2, sizeof(int));
}
close(fd1[0]);
close(fd2[1]);
}
close(fd1[0]);
close(fd2[1]);
printf("Enter integer: ");
scanf("%d",&p);
sprintf(buf1,"%d",p);
write(fd1[1],buf1,sizeof(int));
sleep(3);
for(int i=0;i<n;i++){
sprintf(buf1,"%d",i);
write(fd1[1],buf1,sizeof(int));
read(fd2[0],buf1,sizeof(int));
printf("number is: %s",buf1);
}
close(fd1[1]);
close(fd2[0]);
wait(NULL);
return 0;}
be_childish()
和be_parental()
这两个名称,因为它们长度相同。你的缓冲区(buf1
和buf2
)很小,只能容纳一位数字。如果这确实是你想输入的内容,那就没问题,但非常脆弱(且不必要地脆弱)。 - Jonathan Leffler输入整数
是因为子进程在关闭管道后继续执行父进程的代码。 - Jonathan Leffler