当前位置: 首页 > 面试题库 >

为什么在编写Linux守护程序时必须从tty分离?

叶淇
2023-03-14
问题内容

当我尝试使用C在linux下编写守护程序时,被告知应在 fork 代码块后添加以下代码:

/* Preparations */
...

/* Fork a new process */
pid_t cpid = fork();
if (cpid == -1){perror("fork");exit(1);}
if (cpid > 0){exit(0);}

/* WHY detach from tty ? */
int fd = open("/dev/tty", O_RDWR);
ioctl(fd, TIOCNOTTY, NULL);

/* Why set PGID as current PID ? */
setpgid(getpid(), 0);

我的问题是:是否必须执行上述操作?


问题答案:

您必须将守护进程与终端解除关联,以避免发送与终端操作相关的信号(例如终端会话结束时的SIGHUP以及可能的SIGTTIN和SIGTTOU)。

但是请注意,使用TIOCNOTTY与终端解除关联的方式ioctl已过时。您应该setsid()改用。

守护程序离开其原始进程组的原因是不接收发送到该组的信号。请注意,这setsid()还将您的流程置于其自己的流程组中。



 类似资料:
  • 如何为tarantool编写一个lua程序,它将在后台定期执行一些任务(例如每10分钟一次)?

  • 问题内容: 我正在尝试为Linux编写Mono C#守护程序。 我想在它完成处理时开始和停止它,而不只是取消该过程。 有人有这个例子吗? 编辑:我想出了如何在debian中使用start-stop-daemon –background,所以我想现在就使用它。 编辑:我也在Java中实现这一点,他们有这个不错的addShutdownHook可以捕获终止应用程序。我需要花更多时间来整理单声道服务的依赖

  • 问题内容: 我知道Deamon是后台线程。我们可以通过调用创建自己的守护程序线程。 我的问题是:为什么以及何时需要将我们的线程创建为守护程序线程? 问题答案: 当所有正在运行的线程都是守护程序线程时,JVM将退出。因此,想象一下您正在编写一个简单的游戏,其中您的主要方法一直循环直到您决定退出为止。想象一下,在游戏开始时,您启动了一个线程,该线程将不断轮询某些网站以触发警报。当您决定结束游戏时,您希

  • 本文向大家介绍C语言编写Linux守护进程实例,包括了C语言编写Linux守护进程实例的使用技巧和注意事项,需要的朋友参考一下 守护进程(Daemon)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程是一种很有用的进 程。Linux的大多数服务器就是用守护进程实现的。比如,Internet服务器inetd,Web服务器httpd等。同时,守护进

  • 问题内容: 在Linux中,我想添加一个无法停止且监视文件系统更改的守护程序。如果检测到任何更改,则应在启动控制台的路径上加上换行符。 我已经准备好更改代码的文件系统了,但是我不知道如何创建守护程序。 我的代码来自这里:http : //www.yolinux.com/TUTORIALS/ForkExecProcesses.html 叉后该怎么办? 问题答案: 在Linux中,我想添加一个无法停止

  • 问题内容: 我正在编写Linux守护程序。我发现了两种方法。 通过调用和设置守护进程。 使用运行程序。 哪个是正确的方法? 问题答案: 来自http://www.steve.org.uk/Reference/Unix/faq_2.html#SEC16 以下是成为守护程序的步骤: 1. fork(),以便父级可以退出,这会将控制权返回给命令行或shell来调用您的程序。需要执行此步骤,以确保新流程不