LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 637|回复: 2

按照守护进程的规则写了一个小程序,但我检测不到这个守护进程在运行(程序源码在里面)

[复制链接]
发表于 2005-3-18 12:35:40 | 显示全部楼层 |阅读模式
又得麻烦大家了:
情况如标题所述
[PHP]#include <sys/types.h>
#include <stdio.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <syslog.h>
#include <errno.h>
#include <signal.h>
#include <sys/file.h>




/* initialize,sucess return 0,fail return 1 */
int
main(void)
{
  pid_t pid;
  int fd,fdsize;

  signal(SIGTTOU, SIG_IGN);
  signal(SIGTTIN, SIG_IGN);
  signal(SIGHUP, SIG_IGN);
  signal(SIGTSTP, SIG_IGN);

  pid = fork();
  if(pid < 0)
    {
      fprintf(stderr, "Error: Can't fork a child(first) process!\n");
      return 1;
    }

  if (pid != 0)
    exit (0);

  if (setsid() < 0)
    {
      fprintf(stderr, "Error: setsid funciton fail!\n");
      return 1;
    }
  
  pid = fork();
  
  if (pid < 0)
    {
      fprintf(stderr, "Error: Can't fork a child(second) process!\n");
      return 1;
    }

  if (pid != 0)
    exit (0);
  
  if (chdir("/") < 0)
    {
      fprintf(stderr, "Error: Can't change directory to \"/\"\n");
      return 1;
    }
  
  for (fd = 0,fdsize = getdtablesize(); fd < fdsize; fd++)
    {
      if (close(fd) < 0)
        {
          fprintf(stderr, "Error: Can't close file describe %d.\n", fd);
          return 1;
        }
    }
  
  umask(0);

  signal(SIGCHLD,SIG_IGN);

  syslog(LOG_USER|LOG_INFO,"rogram is beginning\n");

  
  while (1)
    {
      system("date >>1.txt");
      sleep (5);
    }


  exit (0);

}[/PHP]

我编译如下:
gcc -o watch watch.c
直接运行:#./watch
查看此进程
ps axj|grep watch

没有查看到此进程
其中./watch退出的状态用echo $?查看为0,是指父进程的退出状态吗?望解惑
发表于 2005-3-18 13:49:39 | 显示全部楼层
signal(SIGCHLD,SIG_IGN);
写晚了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-3-18 15:43:13 | 显示全部楼层
问题解决了,原来是我把源代码里的exit改成return的结果

return:是返回给调用的函数,不释放资源
exit:是返回给内核,并将资源释放

所以我上面return后是没有退出父进程的,自然也就不能把进程变成守护进程
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表