我正在开发一个程序,它将获取一个整数并创建两个进程,父进程和子进程。父对象将从整数中减去5,将其传递给将其除以5的子项,然后它们将重复此过程5次,每次都打印整数的当前值。
整数可以通过文本文件传递,既可以写入也可以读取,或者可以使用更简单的管道。
我一直在寻找所需的系统调用,并有一个半工作程序。我被困了好几个小时,我认为我的问题是我不能让他们等到对方完成因为我的输出不正确。
这是我到目前为止所得到的。
#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
它似乎开始很好,但是然后孩子没有正确地回传,那么父母在孩子赶上之前连续跑了太多次。我也一直试图修复那个糟糕的文件描述符,但无济于事。
非常感谢任何帮助。
感谢。
答案 0 :(得分:2)
#include <stdio.h>
#include <unistd.h>
#include <err.h>
#define ok(x) ({ int i_ = (x); if (i_ == -1) err(1, #x); i_; })
enum { p_, c_ }; // parent, child
enum { r_, w_ }; // read, write
int main(void)
{
int x = 19530;
int fd[2][2];
int pid;
ok(pipe(fd[0]));
ok(pipe(fd[1]));
ok(pid = fork());
close(fd[p_][pid ? r_ : w_]);
close(fd[c_][pid ? w_ : r_]);
for (int i = 0; i < 5; i++) {
if (pid) {
x -= 5;
printf("X in parent %d\n", x);
ok(write(fd[p_][w_], &x, sizeof(x)));
ok(read(fd[c_][r_], &x, sizeof(x)));
}
else {
ok(read(fd[p_][r_], &x, sizeof(x)));
x /= 5;
printf("X in child %d\n", x);
ok(write(fd[c_][w_], &x, sizeof(x)));
}
}
return 0;
}
管道是单向的,所以你需要两个。我使用了一些枚举来尝试让事情更容易阅读。