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

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的数据都丢失了。
这里写图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

XG_2013

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值