目标是使用 dup、dup2 和管道在父进程和子进程之间进行通信。只是为了了解如何使用 dup 和管道。 由子进程调用的函数 multby 将一个数字作为参数 (3(,并将其与用户输入相乘(在本例中为 5,如在父项中打印(以获得乘积。(应该是 15(
#include <stdio.h>
#include <unistd.h>
void main(int argv, char *argc) {
int testpipe[2];
pipe(testpipe);
int PID = fork();
if (PID == 0) {
dup2(testpipe[0], 0);
close(testpipe[1]);
execl("./multby", "multby", "3", NULL);
close(testpipe[0]);
close(0);
} else {
dup2(testpipe[1], 1);
close(testpipe[0]);
printf("5");
close(1);
close(testpipe[1]);
wait(NULL);
}
}
这是 multby 的代码。我还添加了一些 fprintf 语句来排除故障。特别是,它打印出要相乘的 2 个数字(如上所述应该是 3 和 5(。
#include <stdio.h>
int main(int argv, char *argc[]) {
fprintf(stderr,"exec successfuln");
if (argv < 2) {
fprintf(stderr, "Usage: %s <factor>n", argc[0]);
return 1;
}
size_t a, b;
sscanf(argc[1], "%zu", &a);
fprintf(stderr, "a: %zun", a);
if (scanf("%zu", &b) != 1) {
fprintf(stderr, "No input %zun", a);
return 1;
}
fprintf(stderr, "b: %zun", b);
printf("%zu", a*b);
fprintf(stderr, "multby successfuln");
return 0;
}
但是,这是我的结果: 执行成功 答:3 无输入 3
5 未从管道的读取端注册。
有人可以告诉我我做错了什么吗?
您使用printf(“5”);
将数据中继到子输出,但标准输出至少是行缓冲的,因此在发送换行符(或fflush(stdout)
(之前不会写入任何内容。然后close(1);
关闭标准输出,这不会刷新标准 I/O 缓冲区。 所以什么都没有发送给孩子。 使用fclose(stdout);
将 5 发送给孩子。