linux下实现自动后台运行,脱离输出到终端


看sipp的源代码,看到里面有实现完全后台运行,即脱离了终端。不向终端打印任何信息。

代码如下:

#include <unistd.h>
#include <stdio.h>
#include <errno.h>
#include <fcntl.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#define BUFFER_SIZE 1024

int main(int argc, char *argv[])
{
//	return 0;
        pid_t l_pid;
        switch(l_pid = fork())
        {
            case -1:
                // error when forking !
                printf("Forking error");
                exit(-1);
            case 0:
                // child process - poursuing the execution
                // close all of our file descriptors
                {
                    int nullfd = open("/dev/null", O_RDWR);

                    dup2(nullfd, fileno(stdin));
                    dup2(nullfd, fileno(stdout));
                    dup2(nullfd, fileno(stderr));
                    //sleep(100);

                    close(nullfd);
                }
                break;
            default:
                // parent process - killing the parent - the child get the parent pid
                printf("Background mode - PID=[%d]\n", l_pid);
                exit(1);
        }
                printf("Background mode - PID=[%d]\n", l_pid);
                    sleep(100);
}

关闭了stdin stdout stderr,而父进程在exit(1)处结束,而子进程继续执行下面的sleep等代码。

这里

/dev/null是 

/dev/null看作"黑洞". 它非常等价于一个只写文件. 所有写入它的内容都会永远丢失. 而尝试从它那儿读取内容则什么也读不到. 然而, /dev/null对命令行和脚本都非常的有用.

The function fileno() examines the  argument  stream  and  returns  its
       integer descriptor.

dup2 

 dup2() makes newfd be the copy of oldfd, closing newfd first if  neces‐
       sary, but note the following: 

If  oldfd  is  not a valid file descriptor, then the call fails, and
          newfd is not closed.


       *  If oldfd is a valid file descriptor, and newfd has the same value as
          oldfd, then dup2() does nothing, and returns newfd.

解释下:fileno只是读取FILE *或流的int标志。

             dup2 原型是:int dup2(int oldfd, int newfd); 将newfd是oldfd的一个拷贝,如果newfd打开,则先关闭它。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值