exit庫函數和_exit系統調用對標準輸出的影響
阿新 • • 發佈:2017-05-16
eno 標準 代碼 for sizeof pan type lob int
#include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <stdlib.h> int globvar = 6; char buf[] = "a write to stdout\n"; int main(void) { int var; pid_t pid; var = 88; if(write(STDOUT_FILENO, buf, sizeof(buf)-1) != sizeof(buf)-1) //write系統調用輸出,沒有緩沖區{ exit(1); } printf("before fork!\n"); //標準庫函數輸出,內容會存到緩沖區內 if((pid = fork()) < 0) { perror("fork error!"); exit(1); }else if(pid == 0) { globvar++; var++; }else { sleep(2); } printf("pid = %ld, glob = %d, var = %d\n", (long)getpid(), globvar, var); _exit(0); //采用_exit系統調用不會flush緩沖區的內容到文件 //exit(0); //采用exit庫函數在退出之前會將緩沖區的內容flush到文件 }
代碼源自APUE
直接輸出到屏幕與重定向到文件的輸出內容有差別
"before fork!\n"字符串在重定向到文件時會輸出兩次,一次是父進程的輸出,一次是子進程的輸出。這是在最後的退出調用exit(0)標準庫函數的情況下
在通過系統調用_exit(0)退出進程的時候,標準輸出的內容(通過printf標準庫函數的輸出)不會寫入到重定向之後的文件,只有write系統調用寫入的字符串
exit庫函數和_exit系統調用對標準輸出的影響