【发布时间】:2016-02-04 21:18:02
【问题描述】:
我试图在我的程序中使用 pipe、fork 和 dup 执行 md5sume 命令。我找到了成功运行的 sum 代码,但我无法理解某些代码行。这是我的代码:
int infp, outfp;
char buf[128];
if (popen2("md5sum", &infp, &outfp) <= 0)
{
printf("Unable to exec sort\n");
exit(1);
}
write(infp, "hello\n", 2);
close(infp);
*buf = '\0';
read(outfp, buf, 128);
printf("buf = '%s'\n", buf);
return 0;
}
int p_stdin[2], p_stdout[2];
pid_t pid;
if (pipe(p_stdin) != 0 || pipe(p_stdout) != 0)
return -1;
pid = fork();
if (pid < 0)
return pid;
if (pid == 0)
{
close(p_stdin[WRITE]);
dup2(p_stdin[READ], READ);
close(p_stdout[READ]);
dup2(p_stdout[WRITE], WRITE);
execl("/bin/sh", "sh", "-c", command, NULL);
perror("execl");
exit(1);
}
else
{
if (infp == NULL)
close(p_stdin[WRITE]);
else
*infp = p_stdin[WRITE];
if (outfp == NULL)
close(p_stdout[READ]);
else
*outfp = p_stdout[READ];
}
return pid;
}
我不明白 popen 函数。这条线到底是做什么的?
*infp = p_stdin[WRITE];
管道如何相互通信?
【问题讨论】:
-
格式化你的代码!删除不必要的空行。
-
我猜你说的是
popen2()不是popen()。我还猜想第二个代码块是popen2()函数。您应该参考man 2 pipe并阅读说明。管道由 2 个文件描述符表示,一个用于写入,一个用于读取。您在其中写入的内容可以从中读取。在fork()之后,其中一个进程可以写入,另一个从中读取,因此它们可以通信。 -
是的,我知道这个。我也知道它是 popen2 函数。但我不明白使用整数来实现双向管道,它不是在人中!!
-
READ 和 WRITE 从何而来?