2017-05-18 14 views
0

좋아, 이것은 단지 나의 호기심과 비슷한 질문을하는 다른 사람을 만족시키기위한 것입니다. "나는 모르는 것을 모른다"는 부분적으로는 무지와 오랜 질문을 품어주십시오.리눅스 파이핑 동작

제 1

일부 임의의 콘텐츠를 갖는 fileToFollow.txt 가정한다.

row1 
row2 
row3 

tail fileToFollow.txt | cat을 실행하면 파일의 내용이 예상대로 생성됩니다.

고양이 C 프로그램은 것이라면 내가 하나 개의 프로그램의 출력을 얻기 때문에, 예를 들어 다른 (의 입력으로 공급으로 배관 상상 fileToFollow.txt

에 기록되어 아무것도하고 출력하기에 계속됩니다 tail -f fileToFollow.txt | cat 실행 main() 인수를 통해 해당 입력에 액세스 할 수 있어야합니다.

질문 1 : 여기에 무슨 일이 일어나고 있는지, 꼬리가 출력 될 때마다 호출되는 고양이입니까? 분명 고양이가 여기 자체가 어쨌든 터미널에 출력을하지 그렙으로 필요하지 않습니다

tail -f fileToFollow.txt | grep "whatever" | cat 

: 2

섹션 나는 다음과 같은 설정 혼합으로 grep를 던져하기로 결정했다. 그러나 파이핑이 하나의 프로그램에서 다른 프로그램으로 입력된다는 아이디어가 주어지면 나는 그것이 가능하다고 가정하고있었습니다. 그러나이 경우에는 터 L 널에 출력이 표시되지 않습니다.

물론 다음은 잘 작동 :

tail -f fileToFollow.txt | grep "whatever" 

내가 가진 내가 배관이 실제로 작동하는 방법과 같은 조금 혼란 스러워요 직감 왜 내가 그들을 기대하는 것처럼 행동하지 않는 제시하는 경우 .

모든 종류의 깨우침을 환영합니다. 시간을내어 주셔서 감사합니다.

+0

'| '의 적절한 사용을 상상하기가 힘듭니다. 고양이. 어떤 예에서도 확실히 필요하지 않습니다. –

+0

그것뿐 아니라 | 고양이와 그 기능에 대해별로.이것은 이론적으로 (이론적으로 설명 된 모든 것이 실제로 설명대로 작동한다면) 그것이 작동하지 않는 이유에 대한 나의 이해를 향상시키는 것을 목표로하는 일반적인 질문이다. 그것의 탐구는 실용적이지 않습니다. –

+0

정확하게 작동하지 않는 것은 완전히 불분명합니다. 다르게 행동 할 것으로 예상되는 명령은 무엇입니까? 그것은 무엇을합니까? 무엇을 기대합니까? 이 모든 것을 철자해야합니다. –

답변

1

프로그램으로 파이프 할 때 소스의 표준 출력은 보통 버퍼 모드 (man setvbuf() 참조)로 전환됩니다. 즉, 특정 양의 데이터 (2KiB 또는 4KiB 정도)가 생성되어야 생성됩니다 ~ write(2).

tty에주는 것은 라인 버퍼 모드를 사용하여 버퍼가 \n 이후에 플러시되도록합니다.

이 동작을 수정하는 도구는 stdbuf입니다.

1

질문에 대한 답변 1 : 아니요, 고양이는 항상 프로세스로 실행 중이지만 사용 가능한 것이 없을 때는 stdin을 읽지 못하게합니다. 파이프 라인에있는 프로세스 (꼬리)가 파이프에 새 바이트를 쓰면 읽기 호출이 반환되고 cat은 새 데이터를 처리 할 수 ​​있습니다. 그 후에 다시 읽혀지고 새로운 데이터가 이용 가능할 때까지 차단됩니다.