2012-10-21 2 views
1

UNIX에서 C 프로그램 내에서 쉘 동작을 시뮬레이션해야합니다. 한 가지 중요한 점을 염두에 두어야합니다. 부모 프로세스가 모든 명령을 받아이를 자식에게 보냅니다. 그런 다음 수신 된 명령을 실행 한 다음 출력을 아버지에게 보냅니다. 아이디어는 부모와 기본 자식 인 fork()에서 명령을 받았기 때문에 자신의 자식이 명령을 execvp하고 fifo 파이프로 출력을 보낼 수 있습니다. 문제는 내가 (정확한 출력을 인쇄) while 루프 깰 수 없다 : 나는 FIFO가 가변 크기의 실감하지만, 종료 할 때 둘째 아이는 EOF를 전송해야합니다fifo 채널에서 읽는 while 루프를 깨뜨림

mkfifo("output",S_IFIFO|0644); 
while(read(fifod2,&c,1)) 
     printf("%c",c); 

을 때 읽기 있도록 도달하면 0을 반환합니다. 그러나 그렇게되지는 않습니다. 필요한 경우 코드의 더 많은 부분을 요청하십시오. 감사합니다.

+0

'read()'가 오류를 나타내는 상태 -1로 실패 할 수 있습니다. 그건 루프를 깨지 않습니다. 이 경우 벌크 입력을 사용해야하지만'while (read (fifod, & c, 1) == 1)'에 대해서 테스트해야합니다 :'while ((nbytes = read (fifo, buffer, sizeof (buffer))> 0)'가능한 한 많은 데이터를 처리 할 수 ​​있습니다. 이것은 FIFO가 채워질 때까지 기다리지 않고 사용할 수있는 경우 '짧은 읽기'(지정된 최대 바이트보다 적은 바이트)를 반환합니다. 그것은 시스템을 적게로드 할 것입니다. - 단일 바이트 I/O는 가능하지만 효과적이지 않습니다. (어느 쪽도 기괴하게 비효율적이지는 않지만) –

+0

또한 mkfifo()는 특별한 유형의 파일을 생성하며 열지 않습니다 bdonlan이 말했듯이, 어떤 프로세스에서 FIFO에 쓰기 가능한 파일 파일 디스크립터가 열려 있으면 FIFO에서 EOF를 얻지 못하는 문제가 발생할 수 있습니다 .FIFO가 실제로 열리는 위치와 –

답변

0

부모가 fifo의 끝을 O_RDWR으로 열었으므로 FIFO에 항상 쓸 수있는 파일 설명자가있는 프로세스가 있습니다. EOF는 FIFO에 쓸 수있는 fds가 없을 때만 발생하므로 부모 프로세스가 쓰기 가능한 fd를 열어 놓은 상태로 유지하므로 EOF를 얻지 못합니다.

대신 부모에서 O_RDONLY으로 여는 것을 시도하십시오.

+0

주 자식 코드 : int fifod2 = open ("output", O_RDWR); 보조 자식 코드는 동일합니다 ... 부모는 파이프를 알지 못합니다. –

+0

@IonutGoldan, 그건 충분하지 않습니다. 이것이 실제로 필요한지를 결정하기 위해 첫 번째 호출에서 포크를 통해 위에서 열거 한 루프에 이르기까지 전체 코드 경로를 볼 필요가 있습니다. 무엇이 잘못되었는지 알지 못하는 경우 프로그램의 99 %를 제거하지 마십시오. 프로세스의 버그를 완전히 제거 할 가능성이 있기 때문입니다. – bdonlan

+0

dup2 (fifod2,1); execvp (* argum, argum); 이것은 두 번째 아이가하는 것입니다 –

관련 문제