分页: 1 / 1
关于后台程序的疑惑
发表于 : 2009-10-12 11:18
由 543082593
后台一个进程 比如 firefox&
打开一个终端 然后输入
firefox&
然后 我在此终端输入 exit
则终端本身退出 firefox正常
运行 而我直接关闭终端 就是
鼠标点击那个关闭按钮
firefox也退出了
如果第二种情况我这么理解的话 firefox是bash的子进程 我关闭了终端也就是
终止了bash这个父进程 自然firefox属于bash子进程 也被关闭 那么第二种
情况也就有了解释
可是 我直接输入exit 也是退出父进程bash 但是 子进程firefox怎么没被终止呢
难道是 这里面有什么特殊机制吗
刚又试了一下 nohup firefox& 这个时候 直接关闭终端 firefox不会退出
还有一种情况 我打开 ooffice 和 picasa的时候 直接在终端输入 ooffice 或者
picasa 这个时候 用pstree看下进程树 发现 picasa的直接父进程是 init 而不是
bash 而当然 直接关闭终端 不会退出 picasa
这又是为什么 ?
Re: 关于后台程序的疑惑
发表于 : 2009-10-12 14:33
由 O_O_BOT
问题太长 看了 一句 就看不下去了。

Re: 关于后台程序的疑惑
发表于 : 2009-10-12 14:43
由 slax
不懂
但想了解
Re: 关于后台程序的疑惑
发表于 : 2009-10-12 14:46
由 懒蜗牛Gentoo
等待高人……
Re: 关于后台程序的疑惑
发表于 : 2009-10-12 15:16
由 c\nc
不知道为什么
这个机制应该和 X 有关系,有 GUI 的程序才不会因为 exit 而跟着退出,没有 GUI 的程序在后台工作的时候是不允许 exit 的。
Re: 关于后台程序的疑惑
发表于 : 2009-10-12 15:29
由 O_O_BOT
打开一个终端 然后输入
firefox&
然后 我在此终端输入 exit
则终端本身退出 firefox正常
此处是因为 firefox 在bash 主动的 exit之后 变成的
孤儿进程 会被init 接管 所以 很正常
运行 而我直接关闭终端 就是
鼠标点击那个关闭按钮
firefox也退出了
点x 时 singup信号 发出 导致bash 退出 bash又发singup给各个job 导致firefox进程退出
刚又试了一下 nohup firefox& 这个时候 直接关闭终端 firefox不会退出
nohup 忽略了 singup信号
还有一种情况 我打开 ooffice 和 picasa的时候 直接在终端输入 ooffice 或者
picasa 这个时候 用pstree看下进程树 发现 picasa的直接父进程是 init 而不是
bash 而当然 直接关闭终端 不会退出 picasa
这又是为什么
有可能 这类程序 主动 作了 与bash进程的 脱离
fork一个进程A fork一个子进程B 结束A B成孤儿 归init管
Re: 关于后台程序的疑惑
发表于 : 2009-10-12 16:37
由 c\nc
O_O_BOT 写了:
还有一种情况 我打开 ooffice 和 picasa的时候 直接在终端输入 ooffice 或者
picasa 这个时候 用pstree看下进程树 发现 picasa的直接父进程是 init 而不是
bash 而当然 直接关闭终端 不会退出 picasa
这又是为什么
有可能 这类程序 主动 作了 与bash进程的 脱离
fork一个进程A fork一个子进程B 结束A B成孤儿 归init管
想起来了,gvim 也是这样的。
Re: 关于后台程序的疑惑
发表于 : 2009-10-12 16:57
由 O_O_BOT
接下来的问题就是为什么 第一种情况不会收到sinup 第二种情况会收到sinup
http://blog.csdn.net/cugxueyu/archive/2 ... 46565.aspx
此文章说的很清楚 就懒得重复了。
但其中有个地方不对 job 是归shell管的 不是归session管 虽然属于session.
终端关闭时,该信号被发送到session首进程以及作为job提交的进程(即用 & 符号提交的进程)
此句不准确
job 收不收到singup 由sh决定
此处是由于bash是session首进程 所以受到singup -> job firefox& 也接着收到singup
The shell exits by default upon receipt of a SIGHUP. Before exiting, an interac-
tive shell resends the SIGHUP to all jobs, running or stopped. Stopped jobs are
sent SIGCONT to ensure that they receive the SIGHUP. To prevent the shell from
sending the signal to a particular job, it should be removed from the jobs table
with the disown builtin (see SHELL BUILTIN COMMANDS below) or marked to not
receive SIGHUP using disown -h.
Re: 关于后台程序的疑惑
发表于 : 2009-10-12 21:12
由 543082593
O_O_BOT 写了:打开一个终端 然后输入
firefox&
然后 我在此终端输入 exit
则终端本身退出 firefox正常
此处是因为 firefox 在bash 主动的 exit之后 变成的
孤儿进程 会被init 接管 所以 很正常
运行 而我直接关闭终端 就是
鼠标点击那个关闭按钮
firefox也退出了
点x 时 singup信号 发出 导致bash 退出 bash又发singup给各个job 导致firefox进程退出
刚又试了一下 nohup firefox& 这个时候 直接关闭终端 firefox不会退出
nohup 忽略了 singup信号
还有一种情况 我打开 ooffice 和 picasa的时候 直接在终端输入 ooffice 或者
picasa 这个时候 用pstree看下进程树 发现 picasa的直接父进程是 init 而不是
bash 而当然 直接关闭终端 不会退出 picasa
这又是为什么
有可能 这类程序 主动 作了 与bash进程的 脱离
fork一个进程A fork一个子进程B 结束A B成孤儿 归init管
恩 明白了

Re: 关于后台程序的疑惑
发表于 : 2009-10-12 23:04
由 xhy
取决于子进程如何处理SIGNAL
Re: 关于后台程序的疑惑
发表于 : 2009-10-13 7:02
由 O_O_BOT
xhy 写了:取决于子进程如何处理SIGNAL
不完全准确
在情况一 firefox没有收到singup信号
情况2 收到了singup 默认行为是中断