用C语言来创建守护进程方法大致如下:
- int init_daemon(const char *pathname)
- {
- struct sigaction act;
- int max_fd, i, ret;
- char buf[100];
- /* 第一次调用fork,为setsid做准备 */
- ret = fork();
- if( 0 > ret )
- {
- fprintf(stderr, "error in first fork./n");
- exit(1);
- }
- else if( 0 != ret) /* 父进程退出 */
- exit(0);
- /* 第一次fork的子进程部分 */
- /* 调用setsid,使得进程与旧会话过程相分离 */
- ret = setsid();
- if( 0 > ret )
- exit(1);
- /* 忽略信号SIGHUP */
- act.sa_handler = SIG_IGN;
- sigemptyset(&act.sa_mask);
- act.sa_flags = 0;
- sigaction(SIGHUP, &act, NULL);
- /* 第二次fork,使得进程不再是会话过程的领头进程,不能打开终端作伪自己的控制终端*/
- ret = fork();
- if(0 > ret)
- exit(1);
- else if( 0 != ret ) /* 父进程退出 */
- exit(0);
- /* 第二次fork的子进程部分 */
- /* 修改进程的当前目录 */
- chdir("/");
- /* 清除进程的文件掩码 */
- umask(0);
- /* 使得进程退出原来的进程组,不受原来进程组的干扰 */
- setpgrp();
- /* 关闭进程所有的文件描述符 */
- max_fd = sysconf(_SC_OPEN_MAX);
- for(i = 0; i < max_fd; i++)
- close(i);
- /* 打开空设备,让原来的输入输出移到该设备处 */
- open("/dev/null", O_RDWR);
- dup(1);
- dup(2);
- /* 打开系统日志 */
- openlog(pathname, LOG_PID, 0);
- return 0;
- }