프로그램이 파이프에서 멈춤 (exec ls grep sort)

0 카 자키

파이프를 사용하여 하나의 출력을 다음 입력에 연결하고 두 개의 인수 DIR (디렉토리) 및 ARG (파일 유형, 예 : jpg)를 취하는 다음 명령을 실행하는 프로그램을 만들려고합니다 .

ls DIR -laR | grep ARG | 종류

코드는 다음과 같습니다.

int main(int argc, char *argv[]) {

    if (argc != 3) {
        printf("Invalid arguments. <dir> <arg>\n");
        exit(1);
    }

    int pipe_fd1[2];
    int pipe_fd2[2];
    pid_t ls_pid, grep_pid;
    int status;

    pipe(pipe_fd1);
    pipe(pipe_fd2);

    ls_pid = fork();
    if (ls_pid == 0) { //first child ls DIR -laR
        dup2(pipe_fd1[1], STDOUT_FILENO);
        close(pipe_fd1[0]);

        execlp("ls", "ls", argv[1], "-laR", NULL);

    } else if (ls_pid > 0) {
        grep_pid = fork();
        if (grep_pid == 0) { //second child grep ARG
            dup2(pipe_fd1[0], STDIN_FILENO);
            dup2(pipe_fd2[1], STDOUT_FILENO);       
            close(pipe_fd1[1]);
            close(pipe_fd2[0]);

            waitpid(ls_pid, &status, 0);    
            execlp("grep", "grep", argv[2], NULL);

        } else if (grep_pid > 0) { //parent sort
            dup2(pipe_fd2[0], STDIN_FILENO);
            close(pipe_fd2[1]);

            waitpid(grep_pid, &status, 0);
            execlp("sort", "sort", NULL);
        }

    }

    return 0;
}

붙어있는 것 같습니까? 왜 그런지 모르겠습니까?

필리페 곤살 베스

당신은 결코 가까운 pipe_fd1부모에, 그래서 grepsortdoen't의 노하우 때 입력 읽기를 중단하는 방법 : 파이프가 읽기 및 쓰기 끝이 부모에 폐쇄되지 않습니다 때문에, 독자 블록이 도착하지 않습니다 이상의 입력을 기다리고. 닫아야합니다.

또한 필요하지 않습니다 waitpid(). 파이프가 작동하는 방식은 입력이 파이프 전체에서 선형으로 순서대로 흐르도록합니다.

다음은 이러한 문제가 해결 된 작업 버전입니다.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

int main(int argc, char *argv[]) {

    if (argc != 3) {
        printf("Invalid arguments. <dir> <arg>\n");
        exit(1);
    }

    int pipe_fd1[2];
    int pipe_fd2[2];
    pid_t ls_pid, grep_pid;

    pipe(pipe_fd1);

    ls_pid = fork();
    if (ls_pid == 0) { //first child ls DIR -laR
        dup2(pipe_fd1[1], STDOUT_FILENO);
        close(pipe_fd1[0]);
        execlp("ls", "ls", argv[1], "-laR", NULL);

    } else if (ls_pid > 0) {
        dup2(pipe_fd1[0], STDIN_FILENO);
        close(pipe_fd1[1]);

        pipe(pipe_fd2);
        grep_pid = fork();

        if (grep_pid == 0) { //second child grep ARG
            dup2(pipe_fd2[1], STDOUT_FILENO);
            close(pipe_fd2[0]);  
            execlp("grep", "grep", argv[2], NULL);

        } else if (grep_pid > 0) { //parent sort
            dup2(pipe_fd2[0], STDIN_FILENO);
            close(pipe_fd2[1]);
            execlp("sort", "sort", NULL);
        }

    }

    return 0;
}

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

프로그램이 wait ()에서 멈춤

분류에서Dev

프로그램이 getResponseCode ()에서 멈춤

분류에서Dev

프로그램이 루프에 멈춤

분류에서Dev

프로그램이주기에 멈춤

분류에서Dev

Java 파일에 쓸 때 프로그램이 멈춤

분류에서Dev

Wordcount 프로그램이 hadoop-2.3.0에서 멈춤

분류에서Dev

Java 프로그램이 특정 스레드에서 멈춤

분류에서Dev

Linux 응용 프로그램이 boost :: thread :: join에서 멈춤

분류에서Dev

session.join ()에서 프로그램이 멈춤

분류에서Dev

요청이 PG :: Connection # async_exec에서 멈춤

분류에서Dev

작업 표시 줄에 프로그램이 멈춤

분류에서Dev

Ubuntu 설치 프로그램이 깜박이는 화면에서 멈춤

분류에서Dev

Ubuntu 설치 프로그램이 깜박이는 화면에서 멈춤

분류에서Dev

C에서 Pipe ()를 사용하여 read ()에서 프로그램이 멈춤

분류에서Dev

vb.net 응용 프로그램이 TeamViewer와 함께 멈춤

분류에서Dev

JavaFX 프로그램이 실행 중 잠금 / 멈춤

분류에서Dev

JavaFX 프로그램이 실행 중 잠금 / 멈춤

분류에서Dev

Ubuntu를 설치할 때 설치 프로그램이 멈춤

분류에서Dev

Python 프로그램이 컴퓨터를 멈춤

분류에서Dev

버튼을 누르면 프로그램이 멈춤

분류에서Dev

시작시 기본 응용 프로그램이 멈춤

분류에서Dev

Python-간단한 입력 프로그램이 입력 문에서 멈춤

분류에서Dev

Java에서 클래스 객체 생성시 프로그램이 멈춤

분류에서Dev

http 서버에서 파일을 가져올 때 내 Unity 프로그램이 멈춤

분류에서Dev

제거 된 프로그램 아이콘이 Mac OS X Lion의 Launchpad에 멈춤

분류에서Dev

응용 프로그램 아이콘이 DELPHI XE5에 멈춤

분류에서Dev

Alienware M17x에서 파티션 인식시 Ubuntu 13.10 설치 프로그램이 멈춤

분류에서Dev

Alienware M17x에서 파티션 인식시 Ubuntu 13.10 설치 프로그램이 멈춤

분류에서Dev

설치 프로그램이 "ext4 파일 시스템 생성 중"에서 멈춤

Related 관련 기사

  1. 1

    프로그램이 wait ()에서 멈춤

  2. 2

    프로그램이 getResponseCode ()에서 멈춤

  3. 3

    프로그램이 루프에 멈춤

  4. 4

    프로그램이주기에 멈춤

  5. 5

    Java 파일에 쓸 때 프로그램이 멈춤

  6. 6

    Wordcount 프로그램이 hadoop-2.3.0에서 멈춤

  7. 7

    Java 프로그램이 특정 스레드에서 멈춤

  8. 8

    Linux 응용 프로그램이 boost :: thread :: join에서 멈춤

  9. 9

    session.join ()에서 프로그램이 멈춤

  10. 10

    요청이 PG :: Connection # async_exec에서 멈춤

  11. 11

    작업 표시 줄에 프로그램이 멈춤

  12. 12

    Ubuntu 설치 프로그램이 깜박이는 화면에서 멈춤

  13. 13

    Ubuntu 설치 프로그램이 깜박이는 화면에서 멈춤

  14. 14

    C에서 Pipe ()를 사용하여 read ()에서 프로그램이 멈춤

  15. 15

    vb.net 응용 프로그램이 TeamViewer와 함께 멈춤

  16. 16

    JavaFX 프로그램이 실행 중 잠금 / 멈춤

  17. 17

    JavaFX 프로그램이 실행 중 잠금 / 멈춤

  18. 18

    Ubuntu를 설치할 때 설치 프로그램이 멈춤

  19. 19

    Python 프로그램이 컴퓨터를 멈춤

  20. 20

    버튼을 누르면 프로그램이 멈춤

  21. 21

    시작시 기본 응용 프로그램이 멈춤

  22. 22

    Python-간단한 입력 프로그램이 입력 문에서 멈춤

  23. 23

    Java에서 클래스 객체 생성시 프로그램이 멈춤

  24. 24

    http 서버에서 파일을 가져올 때 내 Unity 프로그램이 멈춤

  25. 25

    제거 된 프로그램 아이콘이 Mac OS X Lion의 Launchpad에 멈춤

  26. 26

    응용 프로그램 아이콘이 DELPHI XE5에 멈춤

  27. 27

    Alienware M17x에서 파티션 인식시 Ubuntu 13.10 설치 프로그램이 멈춤

  28. 28

    Alienware M17x에서 파티션 인식시 Ubuntu 13.10 설치 프로그램이 멈춤

  29. 29

    설치 프로그램이 "ext4 파일 시스템 생성 중"에서 멈춤

뜨겁다태그

보관