【问题标题】:Daemon Socket server in CC中的守护进程套接字服务器
【发布时间】:2013-06-13 03:55:35
【问题描述】:

我已成功创建了一个 C 程序,该程序运行一个无限循环,等待通过套接字进行连接。 我想让它成为一个守护进程并能够启动和停止它。我该怎么做?我应该对我的代码进行哪些更改才能在后台运行?

【问题讨论】:

  • 阅读APUE, Stevens and Rago, chapter 13, Daemon Processes。
  • 您的程序在哪个操作系统上运行?

标签: c linux sockets daemon


【解决方案1】:

成为守护进程所需的经典任务是:

  1. 将工作目录更改为根目录,这样您的守护程序就不会再挂载;
  2. 调用fork()并让父退出,这样该进程就不是进程组长了;
  3. 将标准输入、标准输出和标准错误重定向到/dev/null;
  4. 调用setsid() 使进程成为没有控制终端的新会话的会话组负责人。

没有错误检查:

chdir("/);

if (fork() > 0)
    _exit();

close(0);
close(1);
close(2);
open("/dev/null", O_RDWR);
dup(0);
dup(0);

setsid();

在 Linux 上,glibc 提供了一个 daemon() 辅助函数来完成这些任务。

【讨论】:

  • daemon() 也存在于非 Linux 系统上,尽管它不可​​移植。
  • 这个答案在调用setsid防止父会话阻止组长调用_exit(2)终止子进程时不忽略SIGHUP
【解决方案2】:

要将 c 程序作为守护程序运行,您需要执行以下步骤。

// Create child process
process_id = fork();

//unmask the file mode
umask(0);

//change the directory as your home directory
strcpy(home,"HOME");                                                                                   
home=getenv(home);
chdir(home) ;


//set new session
sid = setsid();
close(STDIN_FILENO); open("/dev/null", O_RDWR);
close(STDOUT_FILENO); open("/dev/null", O_RDWR); 
close(STDERR_FILENO); open("/dev/null", O_RDWR);

【讨论】:

  • 这是错误的:更改为 / 而不是 HOME。不需要 umask。
猜你喜欢
  • 2011-09-08
  • 2015-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-14
相关资源
最近更新 更多