即時通訊嘗試在我的程序中使用pipe,fork和dup.i執行md5sume命令,發現代碼運行成功,但我無法理解一些代碼行。這裏是我的代碼:popen2()如何在c中工作?
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];
管道怎麼能相互交流?
格式化您的代碼!刪除不必要的空行。 – Olaf
你說的是'popen2()'不是'popen()'我猜。我也猜測第二個代碼塊是'popen2()'函數。你應該參考'man 2 pipe'並閱讀描述。管道由2個文件描述符表示,一個用於寫入,另一個用於讀取。你可以從中讀取你寫的內容。 fork()後,其中一個進程可以寫入,另一個從中讀取,以便進行通信。 – hexasoft
嗯,我知道這一點,並且我知道這是popen2函數,但我不能理解使用整數來實現雙向管道,而且它不在人類! – farzane