exit库函数和_exit系统调用对标准输出的影响

#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系统调用写入的字符串

时间: 2024-10-05 05:31:08

exit库函数和_exit系统调用对标准输出的影响的相关文章

exit函数与_exit

从图中可以看出,_exit 函数的作用是:直接使进程停止运行,清除其使用的内存空间,并清除其在内核的各种数据结构:exit 函数则在这些基础上做了一些小动作,在执行退出之前还加了若干道工序.exit() 函数与 _exit() 函数的最大区别在于exit()函数在调用exit  系统调用前要检查文件的打开情况,把文件缓冲区中的内容写回文件.也就是图中的“清理I/O缓冲”. 所需头文件: exit:   #include<stdlib.h> _exit: #include<unistd.h

解析库函数调用与系统调用的区别

基于上一篇文章,系统调用的实现原理,计算机系统的各种硬件资源是有限的,而在现代多任务操作系统上的多个进程都需要这些资源,为了更好的管理这些资源,进程是不允许直接访问的,而是在操作系统的控制下访问,因此操作系统是使用这些资源的唯一入口,而这个入口就是操作系统的系统调用,系统调用属于系统内核的一部分,因此运行在内核态的进程可以直接访问这些资源,而用户态的进程如果想要访问需要先通过中断切换为内核态才可以访问. Linux中处理系统调用的方式与中断类似.每个系统调用都有相应的系统调用号作为唯一的标识,内

linux之Deamon进程创建及其进程exit,_exit,return之间的区别

Dameon进程又被称做守护进程,一般来说他有以下2个特点: 1.生命周期非常长,一旦启动,一般不会终止,直到系统推出,不过dameon进程可以通过stop或者发送信号将其杀死 2.在后台执行,不跟任何控制终端关联,终端信号比如:SIGINT,SIGQUIT,SIGTSTP,以及关闭终端都不会影响deamon 如何编写Daemon进程,需要遵循以下规则: (1)执行fork()函数,父进程退出,子进程继续 执行这一步,原因有二: ·父进程有可能是进程组的组长(在命令行启动的情况下),从而不能够执

linux exit 和 _exit的区别

今天仔细看了一下exit和_exit这两个函数的区别,实际上exit也是调用了_exit退出函数的,只不过在调用_exit之前,exit还进行了一些多余的工作,也正是因为这样,相比起来exit就没有那么接近底层的系统调用,更应该说是包装过的标准C库函数._exit包含在头文件unistd.h中,exit包含在头文件stdlib.h中,我们来查看一下他们的函数原型. man _exit : 很显然,_exit函数做这三件事情: 1. 让调用的进程马上终止. 2.关闭所有由这个进程打开的文件描述符.

exit()与_exit()函数的区别(Linux系统中)

注:exit()就是退出,传入的参数是程序退出时的状态码,0表示正常退出,其他表示非正常退出,一般都用-1或者1,标准C里有EXIT_SUCCESS和EXIT_FAILURE两个宏,用exit(EXIT_SUCCESS);可读性比较好一点. 作为系统调用而言,_exit和exit是一对孪生兄弟,它们究竟相似到什么程度,我们可以从Linux的源码中找到答案: #define __NR__exit __NR_exit /* 摘自文件include/asm-i386/unistd.h第334行 */

linux内核系统调用和标准C库函数的关系分析

今天研究了一下系统调用和标准库函数的区别和联系,从网上搜集的资料如下: 1.系统调用是为了方便应用使用操作系统的接口,而库函数是为了方便人们编写应用程序而引出的,比如你自己编写一个函数其实也可以说就是一个库函数. 2.系统调用可以理解为内核提供给我们在用户态用的接口函数,可以认为是某种内核的库函数. 3.read就是系统调用,而fread就是C标准库函数. 4.很多c函数库中的函数名与系统调用的名称一样是因为该函数本身其实就是调用的系统调用,放到c函数库就是为了用户态的使用 5.写程序直接使用的

Linux中exit与_exit的区别

在exit,_exit的区别 - exit()与_exit()函数的区别(Linux系统中)2012-03-20 15:19:53 分类: LINUX 注:exit()就是退出,传入的参数是程序退出时的状态码,0表示正常退出,其他表示非正常退出,一般都用-1或者1,标准C里有EXIT_SUCCESS和EXIT_FAILURE两个宏,用exit(EXIT_SUCCESS);可读性比较好一点. 作为系统调用而言,_exit和exit是一对孪生兄弟,它们究竟相似到什么程度,我们可以从Linux的源码中

APUE: 进程相关的系统调用和库函数

进程正常终止5种方式: 1.main函数返回 2.调用exit库函数 3.调用_exit或_Exit系统调用 4.最后一个线程从其启动例程返回 5.最后一个线程调用pthread_exit库函数 进程异常终止3种方式: 1.调用abort库函数,产生abort信号. 2.接到一个信号并终止 3.最后一个线程对取消请求做出响应 init进程:pid=1的进程,如果父进程先于子进程终止,子进程就被init进程收养. 孤儿进程:父进程先于子进程退出,子进程被init进程收养,这个子进程就是孤儿进程.

[学习笔记]_exit和exit深入理解

#include<stdio.h> #include<stdlib.h> #include<string.h> #include <unistd.h> #include<errno.h> #include <signal.h> int main(void) { printf("sfsdfsfd"); // 这里没有加\n //exit(0); _exit(0); // 打印不出来 return 0; } // _e