以下是我嘗試瞭解如何在兩個子進程之間進行正確管道的嘗試。我只是試圖將一個Linux命令的輸出傳遞給另一個(ls到cat)並讓程序成功返回。然而,我猜測第二個分叉的孩子被卡住了,父母永遠在等着這個孩子。很長一段時間,我一直在擺弄這段代碼,試圖找出它爲什麼會陷入困境。談到C語言編程時,我很喜歡noob,但我正在努力學習。這個C代碼有什麼問題?孩子沒有回來?
有沒有人知道爲什麼程序不會退出,但掛在貓?
任何幫助將不勝感激。
謝謝。
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <fcntl.h>
int main()
{
char *a[2] = {"/bin/ls", NULL};
char *b[2] = {"/bin/cat", NULL};
char *envp[2] = {getenv("PATH"), NULL};
int fd[2], status;
pipe(fd);
int old_std_out = dup(1);
int old_std_in = dup(0);
dup2(fd[1], 1);
int pid = fork();
switch(pid)
{
case -1:
perror("Forkscrew");
exit(1);
break;
case 0:
execve(a[0], a, envp);
exit(0);
break;
default:
waitpid(-1, &status, 0);
dup2(old_std_out, 1);
break;
}
dup2(fd[0], 0);
pid = fork();
switch(pid)
{
case -1:
perror("Forkscrew");
exit(1);
break;
case 0:
execve(b[0], b, envp);
exit(0);
break;
default:
waitpid(-1, &status, 0);
dup2(old_std_in, 0);
break;
}
printf("\n");
return 0;
}
你是不是在跑兩隻貓?你叉,然後兩個叉再次? –
如果'ls'輸出不適合管道緩衝區,你會怎麼想? – EOF
@SamiKuhmonen 放兩隻貓?也許?第一個在數組a上執行exec,在數組b上執行下一個exec。我認爲fork()返回child和parent。 – user3499524