zoukankan      html  css  js  c++  java
  • exit库函数和_exit系统调用对标准输出的影响

    #include <stdio.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <stdlib.h>
    
    int globvar = 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)    //write系统调用输出,没有缓冲区
        {
            exit(1);
        }
        printf("before fork!
    ");        //标准库函数输出,内容会存到缓冲区内
        
        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
    ", (long)getpid(), globvar, var);
        
        _exit(0);        //采用_exit系统调用不会flush缓冲区的内容到文件
        //exit(0);        //采用exit库函数在退出之前会将缓冲区的内容flush到文件
    }

    代码源自APUE

    直接输出到屏幕与重定向到文件的输出内容有差别

    "before fork! "字符串在重定向到文件时会输出两次,一次是父进程的输出,一次是子进程的输出。这是在最后的退出调用exit(0)标准库函数的情况下

    在通过系统调用_exit(0)退出进程的时候,标准输出的内容(通过printf标准库函数的输出)不会写入到重定向之后的文件,只有write系统调用写入的字符串

  • 相关阅读:
    逆向学习-内嵌补丁(洞穴代码)
    ubuntu下创建ftp用户,该用户只访问特定目录下的内容
    Ubuntu 14.04 FTP服务器--vsftpd的安装和配置
    Hdu 4223 Dynamic Programming?
    Hdu 3873 Invade the Mars
    Hdu 2025 查找最大元素
    Hdu 1520 Anniversary party
    Hdu 4283 You Are the One
    HTTP协议
    常用正则表达式
  • 原文地址:https://www.cnblogs.com/rocklee25/p/6860432.html
Copyright © 2011-2022 走看看