linux下守护进程编程小结

linux下守护进程是在后台执行,并且与控制终端脱离关系,多用于系统服务和作业规划等。编程创建一个linux后台进程主要有以下步骤:

1、创建子进程,父进程退出。子进程不会是进程组长,便于下一步建立新的会议组。

       if(fork()>0) exit(0);

2、建立新的会议组。使子进程成为新的会议组组长,同时脱离原来的会话,进程组,及终端的控制。

     setsid();

3、(也可以不是必须的!)禁止进程重新打开控制终端,现在,进程已经成为无终端的会话组长。但它可以重新申请打开一个控制终端。可以通过使进程不再成为会话组长来禁止进程重新打开控制终端:
  if(pid=fork())
    exit(0);//结束第一子进程,第二子进程继续(第二子进程不再是会话组长)

如果进程有配置文件,应该先设置忽略信号SIGHUP的处理,然后再调用fork()生成第二个子进程,因为第一个子进程成为会话组长,会话组长在退出时对所有该组进程发送SIGHUP信号,而这个信号将致没有控制台的守护进程重新读取配置文件。后其处理如下:

/* 忽略信号SIGHUP */
act.sa_handler=SIG_IGN;
sigemptyset(&act.sa_mask);
act.sa_flags=0;
if(sigaction(SIGHUP,&act,NULL)==-1)exit(1);
/* 子进程退出,孙进程没有控制终端了 */
if(fork()!=0) exit(1);

4、改变当前工作目录为根目录或者/tmp等。守护进程的工作目录无法卸载。

  chdir("/");

5、重设文件打开权限掩码:继承于父进程。掩码某位为‘1’表示相应的用户没有对应位表示的权限,即被屏蔽了。一般将所有屏蔽都取消。

       unmask(0);

6、关闭文件描述符或重定向。守护进程继承了父进程的打开的文件描述符表,且已经与标准输入,标准输出,标准错误失去联系,应该关闭,或者重定向。

 关闭方法通常如此:

   for(i=0;i

 这样,如果进程要输出信息可以使用系统日志服务:syslog;

   重定向一般使用dup,dup2函数:

/* 标准错误重定向 */
error=open("/tmp/error",O_WRONLY|O_CREAT,0600);
dup2(error,STDERR_FILENO);
close(error);
/* 标准输入重定向 */
in=open("/tmp/in",O_RDONLY|O_CREAT,0600);
if(dup2(in,STDIN_FILENO)==-1)perror("in");
close(in);
/* 标准输出重定向 */
out=open("/tmp/out",O_WRONLY|O_CREAT,0600);
if(dup2(out,STDOUT_FILENO)==-1)perror("out");

close(out);

这样把标准IO重定向到文件中了。

7、别的输出信息方法:守护进程使用系统日志管理服务

openlog();打开日志服务的一个链接

closelog();关闭

syslog();向日志中写入消息。


 

 

投 票

觉得本文不错,投一票   

评 论


验证码: 看不清?换一张