noout和&的作用与区别

在Ubuntu上新建tmp.c

vi tmp.c

#include <stdio.h>
void main()
{
    int i=0;
    while(1)
    {
        printf("hello,%d\n",i++);
        sleep(1);
    }
}

 gcc tmp.c

  说明:

    将test.c预处理、汇编、编译并链接形成可执行文件

    未指定输出文件,默认输出为a.out

(1)./a.out

说明:

  GCC编译之后程序默认文件名是a.out

<1>Ctrl+C,程序终止

<2>关闭session,进程终止

(2)./a.out &

<1>ctrl+C程序没终止

<2>关闭session,进程终止

(3)nohup ./a.out

  • 前台没有出现进程号
  • 有一个“忽略输入,输出至nohup.out”的提示
  • hello的输出也没有出现在前台

 

<1> Ctrl+C,进程关闭

<2>关闭session,进程还在

 说明:

  虽然提示输出到nohup.out,但是关闭后查看,发现文件是空的

   因为nohup后,为了提高性能stdout启用了缓冲,并不会实时把内容写入文件,只有当缓冲写满了才会刷盘。

   killall程序时,还来不及刷盘程序就退出了,于是出现了空nohup.out文件

   setbuf(stdout, NULL);     // 把缓存设为空

   fflush(stdout);                 //强制刷盘

#include <stdio.h>
void main()
{
    int i=0;
    while(1)
    {
        printf("hello,%d\n",i++);
        setbuf(stdout,NULL);
        sleep(1);
    }
}

(4)nohup ./a.out &

查看进程

<1>ctrl+C,进程还在

<2>关闭session,进程还在

 

关闭进程

总结:

使用&后台运行程序:

  • 结果会输出到终端
  • 使用Ctrl + C发送SIGINT信号,程序免疫
  • 关闭session发送SIGHUP信号,程序关闭

使用nohup运行程序:

  • 结果默认会输出到nohup.out
  • 使用Ctrl + C发送SIGINT信号,程序关闭
  • 关闭session发送SIGHUP信号,程序免疫

线上经常使用nohup和&配合来启动程序

  • 同时免疫SIGINT和SIGHUP信号
posted @ 2018-04-23 10:56  慕尘  阅读(464)  评论(0编辑  收藏  举报