【小白提问】为什么Linux的进程要设计有父进程的概念
Tofloor
poster avatar
qiansen1386
deepin
2015-02-01 23:30
Author
请问为什么Linux的进程启动要设计为链式的,每个进程都会指向启动它的线程。这导致一个很神奇的现象,比如如果我用terminal启动了一个sudo提权的软件。然后命令行窗口就木有用了啊,随手关掉它会导致之前sudo出来的软件也被关掉。感觉不是很好理解这样的设计理念啊。
请问有木有大神可以帮我们小白理解下:为什么Linux的开发者要做出这样的设计呢?
这样的设计又有何独到之处呢?还是说其实win和Unix也都是这样设计的呢?
Reply Favorite View the author
All Replies
Ldeepin
deepin
2015-02-02 00:11
#1
请问为什么Linux的线程启动要设计为链式的,每个线程都会指向启动它的线程。这导致一个很神奇的现象,比如如果我用terminal启动了一个sudo提权的软件。然后命令行窗口就木有用了啊,随手关掉它会导致之前sudo出来的软件也被关掉。感觉不是很好理解这样的设计理念啊。
请问有木有大神可以帮我们小白理解下:为什么Linux的开发者要做出这样的设计呢?
这样的设计又有何独到之处呢?还是说其实win和Unix也都是这样设计的呢?

1.举个例子,我国有56个民族,而不是13亿个民族。知道为什么?
2."比如如果我用terminal启动了一个sudo提权的软件。然后命令行窗口就木有用了啊"可以在命令后加 “&”,将任务置于后台。
3.记得win中好像也有进程树吧
综上:楼主没有用过“&”,所以将矛盾转移到线程的设计上。
8-)  8-)  8-)
Reply View the author
呆了个呆
deepin
2015-02-02 02:50
#2
你这说的是进程吧,怎么成了线程了?
Reply View the author
qiansen1386
deepin
2015-02-02 07:22
#3
你这说的是进程吧,怎么成了线程了?
口误,已修改。
Reply View the author
qiansen1386
deepin
2015-02-02 07:27
#4
[quote]请问为什么Linux的线程启动要设计为链式的,每个线程都会指向启动它的线程。这导致一个很神奇的现象,比如如果我用terminal启动了一个sudo提权的软件。然后命令行窗口就木有用了啊,随手关掉它会导致之前sudo出来的软件也被关掉。感觉不是很好理解这样的设计理念啊。
请问有木有大神可以帮我们小白理解下:为什么Linux的开发者要做出这样的设计呢?
这样的设计又有何独到之处呢?还是说其实win和Unix也都是这样设计的呢?

1.举个例子,我国有56个民族,而不是13亿个民族。知道为什么?
2."比如如果我用terminal启动了一个sudo提权的软件。然后命令行窗口就木有用了啊"可以在命令后加 “&”,将任务置于后台。
3.记得win中好像也有进程树吧
综上:楼主没有用过“&”,所以将矛盾转移到线程的设计上。
8-)  8-)  8-)[/quote]
所以是打开方式不对……
不过我还是有点疑问啊:
win的命令行是默认都建立与主进程之上,应用之间感受不到必然的连接关系。如果是同一个应用程序的不同进城之间存在进程树的问题。不过这样可以理解,结束进程树是结束树内的所有进程,也就是软件的所有组成部分。而假如linux里有某个程序有三层的进程树,你结束了中间的一层,难道不会导致剩下一个根进程么?还是不好理解啊……
Reply View the author
Ldeepin
deepin
2015-02-02 18:00
#5
如果楼主真想明白,建议从进程的基本概念开始学。
1.非系统应用需要系统应用(服务)提供服务。所以联系还是有的
2.“假如linux里有某个程序有三层的进程树,你结束了中间的一层,难道不会导致剩下一个根进程么”这个我不太好怎么说,好像一个程序,我们只能看到一个进程,你用ps命令看一下。结束某个程序的某个进程,这个我不懂。#一个程序好像就一个PID#
3.不过用pstree你可以看到多个程序之间的进程树
举个例子:
➜  ~  pstree
init─┬─ModemManager───2*[{ModemManager}]
     ├─NetworkManager─┬─dhclient
     │                ├─dnsmasq
     │                └─3*[{NetworkManager}]
     ├─VBoxSVC─┬─VirtualBox───27*[{VirtualBox}]
     │         └─12*[{VBoxSVC}]
     ├─VBoxXPCOMIPCD
     ├─VirtualBox───5*[{VirtualBox}]
看下面3行,都是我的虚拟机,但是用ps -aux | grep V*查看虚拟机的进程只能看到一个PID=2969的进程,所以我觉得应该不能结束某一程序的某一个进程。(但不排除这种可能)
➜  ~  ps -aux | grep V*
deepin      2969  0.0  0.0  12160   932 pts/2    S+   09:51   0:00 grep VirtualBox VMs
➜  ~
本人愚见,希望对你有所帮助。
Reply View the author
MattD
deepin
2015-02-02 18:14
#6
从编程角度来说,父子进程的设计可以便于进行地址空间隔离,避免子进程访问父进程以外的地址空间,破坏其他进程的数据。
从用户角度来说,父子进程的设计也是更便于权限管理和权限隔离,因为Linux是多用户、多任务的分时操作系统。
Reply View the author
qiansen1386
deepin
2015-02-02 21:09
#7
从编程角度来说,父子进程的设计可以便于进行地址空间隔离,避免子进程访问父进程以外的地址空间,破坏其他进程的数据。
从用户角度来说,父子进程的设计也是更便于权限管理和权限隔离,因为Linux是多用户、多任务的分时操作系统。
理解了,大神一出手果然全都有啊!
Reply View the author
qiansen1386
deepin
2015-02-02 21:13
#8
如果楼主真想明白,建议从进程的基本概念开始学。
1.非系统应用需要系统应用(服务)提供服务。所以联系还是有的
2.“假如linux里有某个程序有三层的进程树,你结束了中间的一层,难道不会导致剩下一个根进程么”这个我不太好怎么说,好像一个程序,我们只能看到一个进程,你用ps命令看一下。结束某个程序的某个进程,这个我不懂。#一个程序好像就一个PID#
3.不过用pstree你可以看到多个程序之间的进程树
举个例子:
➜  ~  pstree
init─┬─ModemManager───2*[{ModemManager}]
     ├─NetworkManager─┬─dhclient
     │                ├─dnsmasq
     │                └─3*[{NetworkManager}]
     ├─VBoxSVC─┬─VirtualBox───27*[{VirtualBox}]
     │         └─12*[{VBoxSVC}]
     ├─VBoxXPCOMIPCD
     ├─VirtualBox───5*[{VirtualBox}]
看下面3行,都是我的虚拟机,但是用ps -aux | grep V*查看虚拟机的进程只能看到一个PID=2969的进程,所以我觉得应该不能结束某一程序的某一个进程。(但不排除这种可能)
➜  ~  ps -aux | grep V*
deepin      2969  0.0  0.0  12160   932 pts/2    S+   09:51   0:00 grep VirtualBox VMs
➜  ~
本人愚见,希望对你有所帮助。
真是费心了,多谢你的资料。看完之后,感觉 Linux 其实对这个东西考虑的很深了。不过还是建议系统层面在通过一个程序启动另一个的时候,尽量让新程序的父进程挂到系统后台上,而不是当初程序上。这样应该更有利于解耦,提高易用性。不知道这个是不是软件设计人员的锅。
Reply View the author
呆了个呆
deepin
2015-02-03 17:45
#9
真是费心了,多谢你的资料。看完之后,感觉 Linux 其实对这个东西考虑的很深了。不过还是建议系统层面在通过一个程序启动另一个的时候,尽量让新程序的父进程挂到系统后台上,而不是当初程序上。这样应该更有利于解耦,提高易用性。不知道这个是不是软件设计人员的锅。
你这样想是很不对的,对于有UI的程序我就不说了,通常都要前台执行的。对于命令形式的程序,你想想,如果你要执行多个程序,而多个程序之间是有关系的,一定要前一个执行后,再执行后一个,那么现在的设计就能很好的处理,如果都到后台去执行了,你怎么确定之前那个命令是否执行完成,而后面一个命令应该什么时候开始?
对于你的要求,Linux 是早就实现了的,之前有人回复说在命令最后加一个 & 这是一个方式,还有就是有专门的命令实现这一功能,在 windows 下有个 start 命令,在 Linux 下有个 nohup。当然,如果你要是弄懂了 shell 后,你也可以用 sh 实现一个这种功能,说穿了就很简单
Reply View the author
呆了个呆
deepin
2015-02-03 17:47
#10
看看 apache 的服务启动脚本就有收获,一般都是 fork, exec 两步完成
Reply View the author