C 프로그래밍-파이프를 사용하여 stdout 및 stdin 처리

luis.galdo

저는 부모와 자녀가 만든 C 프로그램을 작성하고 있습니다 (포크 사용). 그들은 파이프를 통해 통신합니다. 부모는 표준 출력을 통해 파이프에 쓰고 자식은 표준 입력을 통해 파이프에서 읽습니다. 일단 연결되면 parent는 파이프에 "hello world"를 쓰고 son은 exec를 호출합니다. 내 코드는 다음과 같습니다.

int main(int argc, char *argv[])
{
 int p, a;
 char buf[1024];
 FILE *file;
 size_t nread;
 int fd[2];
 char argument[PATH_MAX];

 if(pipe(fd)<0){
 return 1;
 }

 p = fork();
 switch(p){
   case -1: perror("Error en el fork()"); return 1;
   case 0:
     close(fd[1]);
     close (0);
     dup(fd[0]);
     close(fd[0]);
     sprintf(argument,"/usr/bin/%s",argv[1]);
     execvp(argument,argv);
     perror("Error en el execv");
     exit(1);
   default: break;
 }
 close(fd[0]);
 close(1);
 a = dup(fd[1]);
 close(fd[1]);
 write(1,"Hello World\n",12);
 close(a);
 wait(NULL);
 return 0;
}

아들에 의해 실행 된 exec 함수는 함수 rev 또는 wc를 호출합니다. 인수없이 호출하면 rev 및 wc가 표준 입력 (제 경우에는 "hello world")에 적용되어야합니다. 그러나 이것은 작동하지 않으며 이유를 모르겠습니다. 어떤 도움이라도 정말 감사하겠습니다.

arayq2

이것은 작동하지 않으며 이유를 모르겠습니다.

당신이 사용하고 있기 때문에 dup(). 자식 프로세스의 표준 입력을 파이프로 리디렉션하려면 올바른 시스템 호출을 사용해야합니다.dup2()

case 0:
    close( fd[1] );
    dup2( fd[0], 0 ); // this "dup"s the read-end of the pipe onto STDIN
    close( fd[0] );

dup()부모 코드 브랜치 에서는 호출 이 전혀 필요하지 않습니다 . 파이프의 쓰기 끝에 쓰기 만하면됩니다.

write( fd[1], "Hello World\n", 12 );

그러나 부모 브랜치에서도 execvp를 사용하여 리디렉션 된 표준 출력으로 다른 프로그램을 시작하려면 dup2()여기에서도 사용해야 합니다.

dup2( fd[1], 1 ); // this "dup"s the write-end of the pipe onto STDOUT
close( fd[1] );

자세한 내용은 맨 페이지dup2참조하십시오.

또한 코드의 또 다른 문제 argv는 인수 목록으로 execvp를 사용하는 것입니다 . 이렇게하면 프로그램 이 상위 프로그램의 전체 명령 줄을 좋아 rev하고 wc수신하므로 표준 입력에서 읽는 대신 처리 할 인수를 찾습니다. 당신은 아마 원합니다

execvp( argv[1], &argv[1] );

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

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

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

nohup을 사용하여 "stdin 및 stdout 리디렉션"에 영향을주지 않고 로그 파일 교체

분류에서Dev

C 프로그램에서 stdout 이스케이프 쿼리 및 stdin 충돌 (ncurses 없음)

분류에서Dev

C ++를 이용한 프로그래밍 원리 및 실습 4 장 드릴 1

분류에서Dev

Unix cat 명령, 파이프 및 stdin / stdout

분류에서Dev

C 프로그램에서 STDOUT을 STDIN으로 리디렉션하는 방법

분류에서Dev

공유 파일 및 dup2 ()를 사용하여 명령의 stdout을 다른 명령의 stdin으로 파이프

분류에서Dev

두 개의 (파이프 stdin 및 stdout) Deno 하위 프로세스를 어떻게 연결합니까?

분류에서Dev

파이썬 하위 프로세스 다중 stdin.write 및 stdout.read

분류에서Dev

C 및 OpenMP를 사용한 병렬 프로그래밍

분류에서Dev

프로세스의 stdin 및 stdout 덤프

분류에서Dev

메타 프로그래밍을 사용하여 "이중 파이프"및 "인스턴스 변수"를 포함하는 코드 리팩터링

분류에서Dev

C ++를 사용한 프로그래밍 원리 및 실습-4 장 '사용해보기'연습

분류에서Dev

열 및 행 RSS를 사용하여 프로그래밍 방식으로 그리드보기 만들기

분류에서Dev

stdin 및 stdout 로깅

분류에서Dev

Rails 4 및 mongoid : 여러 AND 및 OR 조건을 사용하여 프로그래밍 방식으로 쿼리 작성

분류에서Dev

bash 함수를 사용하여 stdin / stdout을 캡처하는 동안 백그라운드로 명령 보내기

분류에서Dev

프로그래밍 장치 및 기계에 C # 사용

분류에서Dev

fscanf, structs 및 struct c 프로그래밍 사용

분류에서Dev

obj c를 사용하여 프로그래밍 방식으로 centreX 및 centreY 제약 조건 추가

분류에서Dev

fpurge를 사용하여 stdin을 지우는 C 프로그램으로 파이프 할 수 있습니까?

분류에서Dev

C #을 사용하여 그리드의 행 수를 프로그래밍 방식으로 조정

분류에서Dev

메모리 할당 및 C 프로그래밍

분류에서Dev

파이썬에서 루비 프로그램의 stdin 및 stdout 제어

분류에서Dev

stdout 및 stdin을 파일로 리디렉션

분류에서Dev

Linux (C 프로그래밍)에서 동적 및 정적 라이브러리를 만들고 사용하는 방법은 무엇입니까?

분류에서Dev

do while 루프 자바 프로그래밍을 사용하여 게임 보드 배열 주위로 플레이어를 이동하는 구문 및 논리

분류에서Dev

C 프로그래밍의 자식 스레드에서 뮤텍스를 사용하여 동기화를 처리하는 방법

분류에서Dev

lapply 및 gsub를 사용하여 데이터 프레임 처리

분류에서Dev

c 프로그래밍에서 파일 처리의 eof (f)

Related 관련 기사

  1. 1

    nohup을 사용하여 "stdin 및 stdout 리디렉션"에 영향을주지 않고 로그 파일 교체

  2. 2

    C 프로그램에서 stdout 이스케이프 쿼리 및 stdin 충돌 (ncurses 없음)

  3. 3

    C ++를 이용한 프로그래밍 원리 및 실습 4 장 드릴 1

  4. 4

    Unix cat 명령, 파이프 및 stdin / stdout

  5. 5

    C 프로그램에서 STDOUT을 STDIN으로 리디렉션하는 방법

  6. 6

    공유 파일 및 dup2 ()를 사용하여 명령의 stdout을 다른 명령의 stdin으로 파이프

  7. 7

    두 개의 (파이프 stdin 및 stdout) Deno 하위 프로세스를 어떻게 연결합니까?

  8. 8

    파이썬 하위 프로세스 다중 stdin.write 및 stdout.read

  9. 9

    C 및 OpenMP를 사용한 병렬 프로그래밍

  10. 10

    프로세스의 stdin 및 stdout 덤프

  11. 11

    메타 프로그래밍을 사용하여 "이중 파이프"및 "인스턴스 변수"를 포함하는 코드 리팩터링

  12. 12

    C ++를 사용한 프로그래밍 원리 및 실습-4 장 '사용해보기'연습

  13. 13

    열 및 행 RSS를 사용하여 프로그래밍 방식으로 그리드보기 만들기

  14. 14

    stdin 및 stdout 로깅

  15. 15

    Rails 4 및 mongoid : 여러 AND 및 OR 조건을 사용하여 프로그래밍 방식으로 쿼리 작성

  16. 16

    bash 함수를 사용하여 stdin / stdout을 캡처하는 동안 백그라운드로 명령 보내기

  17. 17

    프로그래밍 장치 및 기계에 C # 사용

  18. 18

    fscanf, structs 및 struct c 프로그래밍 사용

  19. 19

    obj c를 사용하여 프로그래밍 방식으로 centreX 및 centreY 제약 조건 추가

  20. 20

    fpurge를 사용하여 stdin을 지우는 C 프로그램으로 파이프 할 수 있습니까?

  21. 21

    C #을 사용하여 그리드의 행 수를 프로그래밍 방식으로 조정

  22. 22

    메모리 할당 및 C 프로그래밍

  23. 23

    파이썬에서 루비 프로그램의 stdin 및 stdout 제어

  24. 24

    stdout 및 stdin을 파일로 리디렉션

  25. 25

    Linux (C 프로그래밍)에서 동적 및 정적 라이브러리를 만들고 사용하는 방법은 무엇입니까?

  26. 26

    do while 루프 자바 프로그래밍을 사용하여 게임 보드 배열 주위로 플레이어를 이동하는 구문 및 논리

  27. 27

    C 프로그래밍의 자식 스레드에서 뮤텍스를 사용하여 동기화를 처리하는 방법

  28. 28

    lapply 및 gsub를 사용하여 데이터 프레임 처리

  29. 29

    c 프로그래밍에서 파일 처리의 eof (f)

뜨겁다태그

보관