linux c daemon 程序后台运行函数
linux提供了 daemon()函数主要用于希望脱离控制台,以守护进程形式在后台运行的程序原型:#include <unistd.h>int daemon(int nochdir, int noclose);参数:当nochdir为0时,daemon将更改进城的根目录为root(“/”)。当noclose为0是,daemon将进城的STDIN, STDOU...
·
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&来验证效果。
更多推荐
已为社区贡献89条内容
所有评论(0)