나는 당신을 위한 더미 질문이 있습니다. 파일에서 특수 문자열로 시작하는 일부 줄을 추출하여 파일에 복사하려고 합니다. 나는 시도했다:
cat /dev/ttyACM0 | grep "something" > essai
파일이 생성되었지만 내용이 없습니다!
답변1
효율성을 위해 grep 및 기타 여러 명령을 사용합니다.버퍼링된 입력/출력즉, 한 번에 큰 덩어리로 데이터를 읽고(한 번에 한 문자가 아닌) 특정 양이 누적될 때까지 데이터를 출력하지 않습니다(한 번에 한 줄 또는 한 번에 한 문자를 쓰는 것이 아님).
그러나 프로그램의 입력이 터미널(예: 직렬 포트)에서 오는 경우 운영 체제는 프로그램을 돕고 한 번에 한 줄씩 반환합니다. 프로그램은 터미널을 터미널에 넣어 이를 수행할 수 있습니다.날것의또는비정규 모드;대부분의 사람들은 그렇지 않습니다).
프로그램을 사용할 때표준 입력 및 출력라이브러리에서 터미널에 대한 표준 출력(문서에서는 이를 "대화형 장치"라고 함)은 기본적으로 라인 버퍼링되지만 파일이나 파이프에 대한 출력은 완전히 버퍼링됩니다.
stdio 라이브러리를 사용하는 프로그램은 호출을 통해 전체 버퍼링, 라인 버퍼링 또는 버퍼링 없음을 선택할 수 있습니다.setvbuf
. 당신은 또한 전화할 수 있습니다fflush
언제든지 강제로 글을 쓸 수 있습니다.
GNU grep에는--line-buffered
옵션이 실행됩니다다음 코드일치하는 라인을 출력하는 함수에서:
if (line_buffered)
fflush (stdout);
모든 부분을 하나로 합치기:
다음 명령을 사용하십시오.
cat /dev/ttyACM0 | grep "something" > essai
cat
에서 한 번에 한 줄씩 읽습니다 /dev/ttyACM0
. 몇 킬로바이트의 출력이 누적된 후 파이프에 기록됩니다. 읽기 횟수가 0이 되거나 실패할 때까지(직렬 포트가 오프라인이 될 때까지 발생하지 않을 수 있음) 이 작업을 반복합니다.
grep
한 번에 몇 킬로바이트씩 파이프에서 읽혀지고 몇 킬로바이트의 출력이 누적된 후 파일에 기록됩니다 essai
. 읽기 반환 횟수가 0이 되거나 실패할 때까지 이 작업을 반복합니다. cat
이는 프로세스가 종료되면 발생합니다.
따라서 몇 킬로바이트의 일치하는 줄을 찾을 때까지 essai
파일에 아무 것도 표시 되지 않습니다.grep
출력을 파일에 더 빨리 쓰려면 이 옵션을 GNU grep에 제공할 수 있습니다.
grep --line-buffered < /dev/ttyACM0 > essai
직렬 포트에서 읽기 때문에 라인 버퍼링되며 이 --line-buffered
옵션을 사용하면 출력도 라인 버퍼링됩니다.