fork 함수 실례
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int glob = 6;
char buf[] = "a write to stdout
";
int main(void)
{
int var;
pid_t pid;
var = 88;
if(write(STDOUT_FILENO, buf, sizeof(buf) - 1) != sizeof(buf) -1)
printf("error: write error
");
printf("before fork
");
if((pid = fork()) < 0) {
printf("error: fork error
");
} else if(pid == 0) {
glob ++;
var ++;
} else {
sleep(2);
}
printf("pid = %d, glob = %d, var = %d
", getpid(), glob, var);
exit(0);
}
그런 다음 내보내기 수행
jay@jay-vibox:~/workspace/UNIX/8-1$ cc main.c jay@jay-vibox:~/workspace/UNIX/8-1$ ./a.out a write to stdout before fork pid = 2917, glob = 7, var = 89 pid = 2916, glob = 6, var = 88
------------------------------------------------
jay@jay-vibox:~/workspace/UNIX/8-1$ ./a.out > tmp.out jay@jay-vibox:~/workspace/UNIX/8-1$ jay@jay-vibox:~/workspace/UNIX/8-1$ jay@jay-vibox:~/workspace/UNIX/8-1$ cat tmp.out a write to stdout before fork pid = 2925, glob = 7, var = 89 before fork pid = 2924, glob = 6, var = 88
-----------------------------------------------------------
일반적으로 fork를 한 후에 부모 프로세스를 먼저 실행하는지 하위 프로세스를 실행하는지 확실하지 않습니다.
표준 출력을 쓸 때, 우리는 buf 길이를 1을 출력 바이트로 줄이고, 이것은 null 문자의 쓰기를 중지하는 것을 피하기 위해서입니다.strlen 계산은null 문자를 종료하는 문자열의 길이를 포함하지 않으며,sizeof는null 바이트를 종료하는 버퍼의 길이를 포함합니다.둘 사이의 또 다른 차이점은strlen을 사용하려면 함수 호출이 필요합니다.sizeof의 경우 버퍼는 항상 문자열로 초기화되기 때문에 길이가 고정되어 있기 때문에sizeof는 컴파일할 때 버퍼의 길이를 계산합니다.
이 프로그램을 상호작용으로 실행할 때, 이 printf가 출력하는 줄을 한 번만 얻을 수 있습니다. 표준 출력 버퍼는 줄 바꾸기 문자로 씻겨지기 때문입니다.
그러나 표준 출력이 파일로 바뀌었을 때printf에서 두 번 출력됩니다.그 이유는 fork가 printf를 한 번 호출했지만, fork를 호출할 때, 이 줄의 데이터는 버퍼에 있고, 부모 프로세스의 데이터 공간을 하위 프로세스로 복사할 때, 이 버퍼도 하위 프로세스로 복사되기 때문이다.그래서 그 때 부자 프로세스는 각각 줄 바꿈 내용이 있는 표준 IO 버퍼를 가지고 있었다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
java 입출력 I/O스트림(stream) 자바에서 입출력을 수행하려면 두 대상을 연결하고 데이터를 전송할 수 있는 무언가가 필요한데 이것을 스트림(stream)이라고 정의했다. 스트림은 단방향 통신만 가능하기 때문에 하나의 스트림으로 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.