C 프로그램을 작성하고 싶은데 를 구문 분석해야 합니다 stdin
. 입력하면 cat file.txt | grep -v match
from은 어떻게 구문 분석됩니까? 시리즈인가요? 두 개의 다른 문자열인가요? 나는 달렸고 거기에서 (겉보기에) 유용한 것을 찾지 못했습니다.stdout
cat
-v match
cat /dev/pts/0
file /dev/pts/0
답변1
ㅏ관로읽기 및 쓰기 측과 관련된 파일 설명자를 포함하는 커널에 할당된 버퍼입니다. 실행할 때 cat file.txt | grep -v match
:
- 쉘은 파이프를 생성합니다(
pipe()
시스템 호출을 사용하여) - 쉘
fork()
S. 하위 프로세스는dup2()
시스템 호출을 사용하여 표준 출력 스트림을 닫고 파이프의 쓰기 끝을 표준 출력에 복사합니다. (그 이후 표준 출력에 대한 쓰기는 커널 버퍼로 이동합니다.) 그런 다음 하위 프로세스는 업데이트된 표준 출력을exec()
갖습니다 .cat
- 껍질이
fork()
다시 나타납니다. 하위 프로세스는dup2()
시스템 호출을 사용하여 표준 입력 스트림을 닫고 파이프의 읽기 끝을 표준 입력에 복사합니다. (이후 표준 입력 읽기는 커널 버퍼에서 이루어집니다.) 그런 다음 하위 프로세스는 표준 입력을 업데이트exec()
했습니다 .grep
현재 , 및 둘 다 cat
실행 중 입니다 grep
. grep
표준 입력(파이프)에서 읽으려고 시도하고 파이프가 비어 있으면 읽기가 차단됩니다 . cat
표준 출력(다시 파이프)에 쓰려고 시도하고 파이프가 가득 차면 쓰기가 차단됩니다 . 그렇지 않으면 cat
버퍼에 쓸 때 grep
버퍼에서 읽을 수 있습니다.
답변2
C 프로그램의 주요 기능에 대한 표준 정의는 다음과 같습니다.
int main(int argc, char *argv[])
여기 argc
및 는 이 경우 및 for argv
의 명령줄 인수입니다 . 참고하시기 바랍니다-v
match
grep
아니요단일 문자열이지만 쉘은 인수를 다른 문자열( \0
C에서 일반적으로 NUL/종료)로 분할했습니다. argc
매개변수 수와 argv
매개변수 자체가 포함됩니다.
반면에 표준 입력은 단지 하나이며 모든 기능 FILE *
에서 직접 사용할 수 있습니다 . 등.stdio
fgets(buf, sizeof(buf), stdin)
나는 당신이 그것을 어디서 얻었는지 모르겠습니다 cat /dev/pts/0
. 특정 의사 터미널에서 읽으며 동일한 터미널의 셸에서 읽는 것과 충돌할 수 있습니다. (두 개의 터미널, xterm, SSH 세션, 화면 등을 열어 보십시오. 그런 다음 tty
첫 번째 터미널에서 실행하면 터미널 이름이 표시됩니다(예: ) /dev/pts/123
. cat /dev/pts/123
두 번째 터미널(주어진 이름으로)에서 실행한 다음 다음을 입력해 보십시오. 우선).