fork 함수 실례

2049 단어 IOnull
다음은 포크 함수의 실례이다
#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 버퍼를 가지고 있었다.

좋은 웹페이지 즐겨찾기