C语言 为什么尽管更换了标准,我的管道在 printf 中没有读取?



目标是使用 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 发送给孩子。

最新更新