2010-04-17 5 views
8

파이핑을 지원하는 Linux 쉘을 구현하려고합니다. 이미 간단한 명령, 백그라운드에서 실행중인 명령, 리디렉션을 수행했지만 파이핑은 여전히 ​​누락되었습니다.파이프 구현

나는 이미 그것에 대해 읽었으며 코드 스 니펫을 보았지만 아직 해결 방법을 찾지 못했습니다.

내가 지금까지 가지고 : 당신이 아마 말할 수

int fd[2]; 

pipe(fd); 

pid_t pid = fork(); 

if (pid == -1) 
    return -1; 

if (pid == 0) 
{ 
    close(fd[1]); //close write to pipe, in child 
    execlp("cat", "cat", "names.txt", NULL); 
} 

else 
{ 
    close(fd[0]); //close read from pipe, in parent 
    execlp("sort", "sort", NULL); 
} 

내가, 초보 프로그래머입니다, 내가 뭔가를 프로그래밍하고 때 나는,이 경우 분명되고, I를에 대해 잘 모르는 정말 쉽고 구체적인 것을 시작해서 거기에서 지어지기를 좋아합니다.

그래서 파이프 라인에서 3 가지 이상의 다른 명령을 구현할 수 있기 전에 "ls names.txt | sort"또는 비슷한 이름을 계산할 수 있기를 원합니다. names.txt는 이름이 알파벳순으로 나열된 파일입니다 정렬되지 않은.

코드가 업데이트되었지만 여전히 작동하지 않습니다.

감사합니다.

답변

9

경우 먼저 newfd를 폐쇄 파이프 끝 부분이있는 아이의 stdout과 읽기 끝이있는 다른 아이의 stdin :

if (pid == 0) 
{ 
    close(fd[1]); //close write to pipe, in child 
    dup2(fd[0], STDIN_FILENO); // Replace stdin with the read end of the pipe 
    close(fd[0]); // Don't need another copy of the pipe read end hanging about 
    execlp("cat", "cat", "names.txt", NULL); 
} 
else 
{ 
    close(fd[0]); //close read from pipe, in parent 
    dup2(fd[1], STDOUT_FILENO); // Replace stdout with the write end of the pipe 
    close(fd[1]); // Don't need another copy of the pipe write end hanging about 
    execlp("sort", "sort", NULL); 
} 
4

pipe() 표준 라이브러리 호출을 살펴보십시오. 이것은 파이프를 만드는 데 사용됩니다. 물론 자식 프로세스가 파일 설명자를 올바르게 상속 받기 위해서는 전에fork() 전에 작업해야합니다. 또한

dup2()에 인수의 순서를 참고 :

int dup2(int oldfd, int newfd); 

에서는 dup2()를 newfd를 사본이 될 newfd하게, 당신은 하나를 교체해야 할 필요

+0

나는 파이프의 문을 코드에 추가하는 것을 잊어 버렸다. 지금 무엇을 제안하나요? 감사. – nunos

+0

나는 dup2 (0, fd [0])가 stdout으로 가야 할 것을 fd [0]로 복사한다고 생각했는데, 그것은 프로세스의 입력이다. 나는 내가 원하는 것, 맞지? – nunos

+0

@nunos : dup2()는 복사를하지 않고 파일 설명자를 복사합니다 *. fd [0]은 새로 생성 된 파이프의 한쪽 끝의 fd이기 때문에 dup2()가 수행 할 것처럼 닫히지는 않습니다. – unwind