我正在研究一个程序,该程序将接收一个整数并创建两个进程,一个父进程和一个子进程。父母会从整数中减去5,将其传递给将要除以5的孩子,然后他们将重复该过程5次,每次打印整数的当前值。Linux系统使用Fork()将子字段传递给子进程和父进程调用问题
该整数可以通过文本文件传递并且可以被写入和读取,或者可以使用管道更简单。
我一直在查找所需的系统调用,并有一个半工作程序。然而,我一直坚持了几个小时,我认为我的问题是我无法让他们等待对方完成,因为我的输出不正确。
这是我到目前为止。
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <ctype.h>
#include <fcntl.h>
int main(void)
{
int x=19530;
int w=1;
int fd[2];
pipe(fd);
int pid = fork();
int k;
for (k=0; k<5; k++) {
if (pid>0) {
//int x = 19530;
if ((close(fd[0]))==-1) {
perror("Close:");
}
read(fd[0], &x, sizeof(int));
x=x-5;
write (fd[1], &x, sizeof(int));
printf("X in parent %d\n", x);
close(fd[1]);
close(fd[0]);
} else if (pid==0) {
if ((close(fd[1]))==-1) {
perror("Close:");
}
read(fd[0], &x, sizeof(int));
x=x/5;
printf("X in child %d\n", x);
write (fd[1], &x, sizeof(int));
close(fd[1]);
close(fd[0]);
}
}
return 0;
}
但是我的输出是一个问题,我得到:
X in parent 19525
X in child 3905
Close:: Bad file descriptor
X in parent 19520
Close:: Bad file descriptor
X in parent 19515
Close:: Bad file descriptor
X in parent 19510
Close:: Bad file descriptor
X in parent 19505
Close:: Bad file descriptor
X in child 781
Close:: Bad file descriptor
X in child 156
Close:: Bad file descriptor
X in child 31
Close:: Bad file descriptor
X in child 6
它似乎开始很好,但随后则父运行次数过多,孩子没有传回正确在孩子赶上之前一排。我也一直试图修复那个不好的文件描述符,但无济于事。
任何帮助将不胜感激。
谢谢。
关闭它后,您既不能读取也不能写入文件描述符。 – alvits
您创建了一对文件描述符。然后,你关闭他们5次。第一次关闭它后,它关闭。你期望发生什么? – immibis
你有每一方首先执行'read',然后执行'write'。一个'read'将会阻塞,直到有人调用'write',那么谁先写? – dbush