以下是我尝试了解如何在两个子进程之间进行正确管道的尝试。我只是试图将一个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