return、exit、_Exit、_exit区别(unix系统)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/XG_2013/article/details/70723379

return终止一个函数并给该出函数的返回值,如果函数是main函数则终止一个进程并给出进程的返回值。
exit终止一个进程。
**注意:exit函数总是执行一个标准的I/O库的清理和关闭的操作例如对于打开的流调用fclose函数等。
_exit和_Exit终止一个进程立即进入内核。**

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int globvar = 6;
char buf[] = "write to Stdout\n";
int main()
{
    pid_t pid;
    int var = 10;
    if(write(STDOUT_FILENO,buf,sizeof(buf)-1) != sizeof(buf)-1)
        perror("write err");
    printf("before fork\n");
    if((pid = fork()) < 0 )
    {
        perror("fork err");
    }
    if(pid == 0){
        globvar++;
        var++;
    }
    else{
        //sleep(2);
        printf("child pid = %ld\n",(long)pid);
    }
    printf("pid = %ld,glob = %d,var = %d\n",(long)getpid(),globvar,var);
    //_Exit(0);
    return(0);
}

return(0)此时与exit(0)等价,程序没有直接交互式的运行输出到终端。./fork_start >test输出定向到test文件。因为交互式的运行带缓冲的IO(printf)输出遇到换行符号就会冲洗到终端,这样就没法区别这几个函数了。定向到test文件,由于没有及时的冲刷缓冲的数据,如果程序退出的方式不一样我们就能看到不同的结果。至于为什么显示2次before fork,因为父子进程都有before fork行缓冲。
这里写图片描述

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int globvar = 6;
char buf[] = "write to Stdout\n";
int main()
{
    pid_t pid;
    int var = 10;
    if(write(STDOUT_FILENO,buf,sizeof(buf)-1) != sizeof(buf)-1)
        perror("write err");
    printf("before fork\n");
    if((pid = fork()) < 0 )
    {
        perror("fork err");
    }
    if(pid == 0){
        globvar++;
        var++;
    }
    else{
        //sleep(2);
        printf("child pid = %ld\n",(long)pid);
    }
    printf("pid = %ld,glob = %d,var = %d\n",(long)getpid(),globvar,var);
    _Exit(0);
   // return(0);
}

_Exit(0);此时与_exit(0)等价,程序没有直接交互式的运行输出到终端。./fork_start >test输出定向到test文件。因为交互式的运行带缓冲的IO(printf)输出遇到换行符号就会冲洗到终端,这样就没法区别这几个函数了。定向到test文件,由于没有及时的冲刷缓冲的数据,如果程序退出的方式不一样我们就能看到不同的结果。 _Exit(0)立即进入内核执行退出,所以除了使用write这个不带缓冲的IO写到test文件,其他的带缓冲的IO的数据都丢失了。
这里写图片描述

猜你喜欢

转载自blog.csdn.net/XG_2013/article/details/70723379