다음은 두 자식 프로세스간에 올바른 파이핑을 수행하는 방법을 이해하려고 시도한 것입니다. 나는 한 리눅스 명령의 출력을 다른 명령에 넘겨주고 프로그램을 성공적으로 반환하려고한다. 그러나 나는 두 번째 자식이 갇혀 있고 부모는이 자식을 영원히 기다리고 있다고 생각합니다. 나는 왜이 코드가 오랫동안 빠져 나가고 있는지 알아 내려고 노력 해왔다. 나는 C 시스템 프로그래밍에 관해서는 다소 멍청하다. 그러나 나는 배우려고 노력하고있다.이 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
@SamKuhmonen 두 마리의 고양이를 돌보는 중입니까? 아마도? 첫 번째는 배열 a에서 exec를하고 배열 b에서 다음 exec를 수행합니다. fork()가 자식과 부모를 반환한다고 생각했습니다. – user3499524