[英]read integer from user and write into child pipe and then parent pipe read from it
我正在尝试在管道中执行简单的读/写操作,但这给了我错误
这是我的代码:
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<fcntl.h>
#define BUFSIZE 80
int main()
{
int fd[2],n,i,h;
char buf[BUFSIZE];
pipe(fd);
switch(fork())
{
case -1 :printf("Fork Error");
exit(0);
case 0 :close(fd[0]);
printf("Enter N :");
scanf("%d",&n);
write(fd[1],&n,sizeof(n));
close(fd[1]);
case 1 :close(fd[1]);
n=read(fd[0],&h,sizeof(h));
for(i=1;i<=h;i++)
{
if(i%2==1)
{
write(1,&i,n);
}
}
close(fd[0]);
}
exit(0);
}
在此代码中:关闭孩子的fd [0]指针,然后从孩子的fd [1]指针写入,然后从fd [1]指针读取父对象,并将其存储在h变量中,然后变量i的值进入STDOUT_FILENO(1)并在标准输出上显示输出
输出:
卡尔蒂克@ Ubuntu的:〜/桌面/ ISP $
输入N:6
6:找不到命令
这里有几个问题:
N
,但是父进程是从终端接收输入的进程。 因此,当您输入“ 6”时,父进程已退出,并且您正在将该值输入到Shell中。 将printf
和scanf
移至fork
之前,您应该能够正确读取该值。 fork()
从父级返回时,将不会输入case 1
,这似乎是您的意图。 fork()
将孩子的pid返回给父对象。 因为特殊的init
过程具有pid 1,所以永远不会如此。 将case 1:
更改为default
以处理父流程。 break
。 在C中,切换用例“失败”,这意味着一旦一个用例的语句完成,它将继续运行以下用例的语句。 在每种情况下, break
语句都会阻止这种情况的发生。 通过这些更正,您现在有了:
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<fcntl.h>
#define BUFSIZE 80
int main()
{
int fd[2],n,i,h;
pid_t pid; // to capture the child pid
char buf[BUFSIZE];
// prompt for N before forking
printf("Enter N :");
scanf("%d",&n);
pipe(fd);
switch((pid=fork())) // saving the child pid in case we want to use it later
{
case -1 :
printf("Fork Error");
exit(0); // no break needed here because of exit
case 0 :
close(fd[0]);
write(fd[1],&n,sizeof(n));
close(fd[1]);
break; // end of case 0
default :
close(fd[1]);
n=read(fd[0],&h,sizeof(h));
printf("h=%d\n",h);
for(i=1;i<=h;i++)
{
if(i%2==1)
{
//write(1,&i,n);
printf("%d\n",i);
}
}
close(fd[0]);
break; // end of default case
}
exit(0);
}
您的父进程需要等到其子主题完成工作并将数据推送到管道中后,才能执行此操作。
所以添加下面的行。
wait(&status);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.