간섭 없이 FIFO 파이프에서 인쇄하시겠습니까?

간섭 없이 FIFO 파이프에서 인쇄하시겠습니까?

Unix에서 FIFO 명명된 파이프를 통해 메시지를 주고받는 여러 C 프로그램이 있는데 외부 프로그램을 사용하여 파이프에서 무슨 일이 일어나고 있는지 확인하고 싶습니다. 문제는 를 사용하면 다음 프로그램 호출 이후에 중지 cat되고 write()파이프를 닫아 프로그램 간의 통신이 끊어지고... 그러다가 나쁜 일이 발생한다는 것입니다. cat파이프가 왜 닫혀 있는지 이해가 되지 않습니다 . 편집: 나는 실제로 오늘 똑같은 일을 했고 파이프를 닫는 대신 프로세스가 파이프 읽기를 중단했습니다.

cat그렇다면 파이프를 전혀 방해하지 않고 보이는 대로 인쇄한다는 점만 제외하고 비슷한 것이 있습니까 ?

관련이 있는 경우 다음과 같이 C로 파이프라인을 생성합니다.

outs[i2/2] = open("/tmp/pipe_w", O_WRONLY);
ins[i2/2] = open("/tmp/pipe_r", O_RDONLY);

업데이트: 다음은 터미널 예시입니다.

내 프로세스는 파이프를 열 때 다음 출력을 인쇄합니다.

Opened in pipe at /tmp/ai1In
Opened out pipe at /tmp/ai1Out

그런 다음 별도의 셸에서 이 작업을 수행합니다.

admin$ cat /tmp/ai1Out
ai1

"ai1"이라는 메시지가 표시되고 아무 것도 표시되지 않습니다. 파이프를 읽는 프로세스는 결국 영원히 기다리게 됩니다. 을 죽 cat였으나 파이프는 여전히 읽혀지지 않았습니다.

업데이트 2:

cat [path] | tee [path]어떤 경우에는 작동합니다. 내 파이프라인을 눈에 띄게 방해하지는 않지만 ai1Out그렇습니다 ai1In. 차이점은 내 코드 때문임에 틀림없습니다. 그럼에도 불구하고 이는 이 명령을 실행하면 내가 원하지 않는 파이프를 사용하는 다른 프로세스에 어느 정도 영향을 미친다는 것을 의미합니다. 읽으려고 할 때 ai1Out이것을 본 다음 해당 파이프에 쓰는 프로세스가 다음에 호출될 때 오류가 발생합니다 write().

admin$ cat /tmp/ai1In | tee /tmp/ai1In
]2,15,43,66,65,61,53,20,30,27,40,16,50,41,48[[[[[[[[

답변1

파이프의 정의는 파이프에 기록된 데이터를 다른 쪽 끝에서 읽는다는 것입니다. 파이프는 데이터를 복사하지 않습니다. 파이프를 읽는 것은 파괴적인 작업입니다. 파이프에 두 개의 판독기가 있는 경우 각 바이트는 판독기 중 하나만 읽습니다.

파이프를 통해 두 프로그램 간의 통신을 모니터링하려면 다음을 삽입하면 됩니다.tee ~ 사이프로그램. 그런 다음 두 개의 파이프가 있습니다. 하나는 작성자에서 독자로, 다른 tee하나는 tee작성자에서 독자로 연결됩니다.

mkfifo pipe_w pipe_r
writer >pipe_w
reader <pipe_r
<pipe_w tee pipe_r

귀하의 질문에 있는 파이프 명명 체계가 일관되지 않아 정확히 무엇을 시도했는지 알 수 없습니다. 파이프에서 자체로 데이터를 다시 공급하려는 것 같습니다. 이것은 작동하지 않습니다. 일부 데이터가 파이프로 영원히 돌아가는 폐쇄 루프를 만듭니다(어떤 바이트가 파이프로 돌아갈지, 어떤 바이트가 원래 리더로 돌아갈지 예측하는 것이 불가능하기 때문에 부분 데이터만).

두 프로세스 사이에 파이프가 있고 파이프를 변경할 수 없는 경우 이를 모니터링하는 가장 쉬운 방법은 작성기 또는 판독기 프로세스를 추적하는 것입니다. 예를 들어, 쓰기 프로세스의 PID가 123이고 파일 설명자 4에서 파이프가 열린 경우 Linux에서는 다음을 사용할 수 있습니다.

strace -p123 -e write=4

관련 정보