运行这个评估指数泰勒扩展的程序,使用在每个循环中创建的子进程将该总和的一个数字返回给父进程,它导致我出现了一个糟糕的文本描述符错误,尽管我不知道知道为什么,我认为这个问题可能与我在循环中打开和关闭管道的方式有关。
我的代码是:
#include<unistd.h>
#include<stdio.h>
#include<sys/wait.h>
#include<stdlib.h>
int main()
{int i; pid_t id;
int count=1;
int fact=1;
int N;
double S=1;double s1=0; double div;double x;
int p[2];
printf("Input x and N : \n");
scanf("%lf %d",&x,&N);
if(pipe(p) == -1)
{perror("Error opening pipe");
return -1; }
else{
for(i=1;i<=N;i++)
{ id=fork();
if(id==0)
{ close(p[0]);
while(count<i)
{ fact*=(fact+1);
x*=x;
count++;
}
div=x/fact;
if(write(p[1],&div,sizeof(double))!=sizeof(double))
perror("file writing error");
exit(0);
}
else {
wait(NULL);
close(p[1]); \\ ***<-- Problem here***
if(read(p[0],&s1,sizeof(double))!=sizeof(double))
{
perror("file become empty");
return -1;}
S+=s1;
}}}
printf("Sum = %lf",S);
return 1;}
答案 0 :(得分:2)
不用前叉后,关闭管道各自的读/写端。
答案 1 :(得分:0)
我想我发现了问题,但我仍然不知道如何解决;在父进程中的p [1]结束时,并且在分叉第二个子进程之后,子进程和管道之间没有关联的写文件描述符,因为它不再从父进程继承,我标记了错误的命令我的代码,仍然需要找到一个解决方案来避免这种情况。