linux编程-创建daemon进程时为什么要用setsid创建一个新的session?

问题描述

创建daemon进程时为什么要用setsid创建一个新的session?

不管是unix环境高级编程还是网络上都说创建daemon的步骤是:
1. fork
2. setsid创建新session
3. 父进程exit
这样子进程就能脱离terminal了.

这样子确实没错, 我之前以为这是为了避免子进程被强制退出, 所以才要脱离terminal和父进程.

但是在实验的时候发现, 没有setsid, 仅仅fork一个子进程并让子进程无限循环, 父进程fork之后exit, 子进程并没有随之结束. 仍然在运行. 同样我在终端输入exit命令之后, 子进程仍然还在运行. 也就是说子进程并不会被强制退出, 那还要创建新的session干嘛?

解决方案

fork子进程后,它会继承父进程所有相关的上下文信息,setsid就是来创建一个新的session,从而清除这些无关信息。

时间: 2025-01-18 15:00:34

linux编程-创建daemon进程时为什么要用setsid创建一个新的session?的相关文章

建表-当我要查询的数据同时在两个表中时,是否应该再建一个新的表?

问题描述 当我要查询的数据同时在两个表中时,是否应该再建一个新的表? 我有一个收入表(表1),一个支出表(表2),然后这样的话就可以对它们进行操作,但是我现在想要查询一个月之内的收支记录,按时间先后排序,我该怎么做呢?我要再建一个表把表1,表2的数据插进去么?还是有别的办法? 解决方案 使用联表连接两个表将两个表的数据同时显示出来或者将两个表的数据查出来后放入到视图当中 解决方案二: 当我每查询一次(当表1,表2更新时)的时候都要先把数据放到视图当中,是不是应该用触发器啊? 解决方案三: 你可以

linux 创建守护进程的相关知识_linux shell

创建子进程,父进程退出 这是编写守护进程的第一步.由于守护进程是脱离控制终端的,因此,完成第一步后就会在Shell终端里造成一程序已经运行完毕的假象.之后的所有工作都在子进程中完成,而用户在Shell终端里则可以执行其他命令,从而在形式上做到了与控制终端的脱离. 在Linux中父进程先于子进程退出会造成子进程成为孤儿进程,而每当系统发现一个孤儿进程是,就会自动由1号进程(init)收养它,这样,原先的子进程就会变成init进程的子进程. 在子进程中创建新会话 这个步骤是创建守护进程中最重要的一步

控件-android studio 创建blank activity时生成content_main.xml

问题描述 android studio 创建blank activity时生成content_main.xml 为什么创建按blank activity的时候会自动生成content_main.xml,而且只有content_main.xml能往上拖控件,而activity_main.xml却不能往上面拖控件 解决方案 如果出现这种情况的话:activity_main_xml 是控制整个xml布局的情况 而content_main_xml是控制xml里面的内容的 在activity_main_x

分析Linux内核创建一个新进程的过程【转】

转自:http://www.cnblogs.com/MarkWoo/p/4420588.html 前言说明 本篇为网易云课堂Linux内核分析课程的第六周作业,本次作业我们将具体来分析fork系统调用,来分析Linux内核创建新进程的过程 关键词:fork, 系统调用,进程 *运行环境:** Ubuntu 14.04 LTS x64 gcc 4.9.2 gdb 7.8 vim 7.4 with vundle 分析 分析方法说明 PCB包含了一个进程的重要运行信息,所以我们将围绕在创建一个新进程时

线程-求救高手。。linux c编程,用进程池实现shell命令cp

问题描述 求救高手..linux c编程,用进程池实现shell命令cp 现在状态是,复制单个文件没问题,复制一个目录且目录里没有子目录也没问题. 如果目录里有一个子目录,这样貌似没有问题,但是如果有多个子目录,就会出现各种问题. 弄了一个晚上了,各种惆怅,求救各位老大帮忙看看. 本人新手,代码比较乱真的非常抱歉. //code start #include #include #include #include #include #include #include #include #inclu

求助 linux 编程 创建服务器

问题描述 求助 linux 编程 创建服务器 创建一个服务器 让多个终端连接并交互信息 最后用SIGUSR1关闭连接 用SIGUSR2记录连接终端的个数 解决方案 <linux高性能服务器编程>读书笔记linux网络编程多进程并发服务器Linux select TCP并发服务器与客户端编程

linux网络编程-LINUX下模拟DNS编程,写报文时关于DOMAIN NAME 的格式转换程序

问题描述 LINUX下模拟DNS编程,写报文时关于DOMAIN NAME 的格式转换程序 这段程序要求是转换格式,如www.baidu.com换成3www5baidu3com0 网上有代码 void ChangetoDnsNameFormat(unsigned char* dns,unsigned char* host) { int lock = 0 , i; strcat((char*)host,"."); for(i = 0 ; i < strlen((char*)host)

socket编程,在创建socket服务时出错,下图为程序和报错

问题描述 socket编程,在创建socket服务时出错,下图为程序和报错

Linux下C编程:sigsuspend进程阻塞

int sigsuspend(const sigset_t *sigmask); 此函数用于进程的挂起,sigmask指向一个信号集.当此函数被调用时,sigmask所指向的信号集中的信号将赋值给信号掩码.之后进程挂起.直到进程捕捉到信号,并调用处理函数返回时,函数sigsuspend返回.信号掩码恢复为信号调用前的值,同时将errno设为EINTR.进程结束信号可将其立即停止. #include <stdio.h> #include <signal.h> void checkse