1. 程式人生 > >exit庫函數和_exit系統調用對標準輸出的影響

exit庫函數和_exit系統調用對標準輸出的影響

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系統調用對標準輸出的影響