linux提供了 daemon()函数主要用于希望脱离控制台,以守护进程形式在后台运行的程序

原型:

#include <unistd.h>

int daemon(int nochdir, int noclose);

参数:

当nochdir为0时,daemon将更改进城的根目录为root(“/”)。

当noclose为0是,daemon将进城的STDIN, STDOUT, STDERR都重定向到/dev/null。

返回值:

deamon()调用了fork(),如果fork成功,那么父进程就调用_exit(2)退出,所以看到的错误信息 全部是子进程产生的。如果成功函数返回0,否则返回-1并设置errno。

daemon的实现大致如下:

int daemon( int nochdir, int noclose )
{
    pid_t pid;

    if (!nochdir && (chdir("/") != 0)) //如果nochdir=0,那么改变到"/"根目录
    {
        return -1;
    }

    if (!noclose)  //如果没有noclose标志
    {
        int fd = open("/dev/null", O_RDWR);
        if (fd < 0)
        {
            return -1;
        }

        /* 重定向标准输入、输出、错误 到/dev/null,
           键盘的输入将对进程无任何影响,进程的输出也不会输出到终端
         */
        dup(fd, 0);
        dup(fd, 1);
        dup(fd, 2);
        close(fd);
    }

    pid = fork(); //创建子进程.
    if (pid < 0)   //失败
    {
        return -1;
    }

    if (pid > 0)
    {
        _exit(0); //返回执行的是父进程,那么父进程退出,让子进程变成真正的孤儿进程.
    }

    //创建的 daemon子进程执行到这里了
    if (setsid() < 0)     //创建新的会话,并使得子进程成为新会话的领头进程
    {
        return -1;
    }

    return 0; //成功创建daemon子进程
}

 

使用示例如下:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <limits.h>

int main(int argc, char *argv[])
{
	char strCurPath[PATH_MAX];

	if(daemon(1, 1) < 0)
	{
		perror("error daemon.../n");
		exit(1);
	}
	sleep(10);

	if(getcwd(strCurPath, PATH_MAX) == NULL)
	{
		perror("error getcwd");
		exit(1);
	}
	printf("%s/n", strCurPath);
	return 0;
}

假如运行成功,父进程在daemon函数运行完毕后自杀,以后的休眠和打印全部是子进程来运行。

可以修改daemon函数的参数来查看效果。

可以去掉daemon一句,用./a.out&来验证效果。

 

Logo

更多推荐