UNIX에서 C 프로그램 내에서 쉘 동작을 시뮬레이션해야합니다. 한 가지 중요한 점을 염두에 두어야합니다. 부모 프로세스가 모든 명령을 받아이를 자식에게 보냅니다. 그런 다음 수신 된 명령을 실행 한 다음 출력을 아버지에게 보냅니다. 아이디어는 부모와 기본 자식 인 fork()에서 명령을 받았기 때문에 자신의 자식이 명령을 execvp하고 fifo 파이프로 출력을 보낼 수 있습니다. 문제는 내가 (정확한 출력을 인쇄) while 루프 깰 수 없다 : 나는 FIFO가 가변 크기의 실감하지만, 종료 할 때 둘째 아이는 EOF를 전송해야합니다fifo 채널에서 읽는 while 루프를 깨뜨림
mkfifo("output",S_IFIFO|0644);
while(read(fifod2,&c,1))
printf("%c",c);
을 때 읽기 있도록 도달하면 0을 반환합니다. 그러나 그렇게되지는 않습니다. 필요한 경우 코드의 더 많은 부분을 요청하십시오. 감사합니다.
'read()'가 오류를 나타내는 상태 -1로 실패 할 수 있습니다. 그건 루프를 깨지 않습니다. 이 경우 벌크 입력을 사용해야하지만'while (read (fifod, & c, 1) == 1)'에 대해서 테스트해야합니다 :'while ((nbytes = read (fifo, buffer, sizeof (buffer))> 0)'가능한 한 많은 데이터를 처리 할 수 있습니다. 이것은 FIFO가 채워질 때까지 기다리지 않고 사용할 수있는 경우 '짧은 읽기'(지정된 최대 바이트보다 적은 바이트)를 반환합니다. 그것은 시스템을 적게로드 할 것입니다. - 단일 바이트 I/O는 가능하지만 효과적이지 않습니다. (어느 쪽도 기괴하게 비효율적이지는 않지만) –
또한 mkfifo()는 특별한 유형의 파일을 생성하며 열지 않습니다 bdonlan이 말했듯이, 어떤 프로세스에서 FIFO에 쓰기 가능한 파일 파일 디스크립터가 열려 있으면 FIFO에서 EOF를 얻지 못하는 문제가 발생할 수 있습니다 .FIFO가 실제로 열리는 위치와 –