我编写了一个程序来捕获来自网络接口的数据包。当它侦听网络适配器时,我需要使用来运行它sudo
。问题是,为什么我在运行它时将两个进程添加到进程列表中?
注意:lwdpi
是我的程序
执行前:
ghasemi@ghasemi-MS-7693:~/Desktop/lwdpi_cpp$ ps ax | grep lwdpi
4665 pts/21 S+ 0:00 grep --color=auto lwdpi
ghasemi@ghasemi-MS-7693:~/Desktop/lwdpi_cpp$
Execution:
ghasemi@ghasemi-MS-7693:~/Desktop/lwdpi_cpp$ sudo ./lwdpi -i enp5s0
2016:10:26 11:07:29 :: 192.168.1.25 9918 --> 239.1.99.222 9918 UDP
2016:10:26 11:07:29 :: 192.168.1.111 5353 --> 224.0.0.251 5353 UDP
2016:10:26 11:07:30 :: 192.168.1.153 5353 --> 224.0.0.251 5353 UDP
2016:10:26 11:07:30 :: 192.168.1.154 5353 --> 224.0.0.251 5353 UDP
2016:10:26 11:07:30 :: 192.168.1.88 5353 --> 224.0.0.251 5353 UDP
2016:10:26 11:07:30 :: 192.168.1.60 5353 --> 224.0.0.251 5353 UDP
2016:10:26 11:07:37 :: 192.168.1.131 17500 --> 255.255.255.255 17500 UDP
2016:10:26 11:07:37 :: 192.168.1.131 17500 --> 192.168.1.255 17500 UDP
2016:10:26 11:07:37 :: 192.168.1.169 5546 --> 192.168.1.38 53 UDP
2016:10:26 11:07:37 :: 192.168.1.169 30955 --> 192.168.1.38 53 UDP
2016:10:26 11:07:38 :: 192.168.1.110 17500 --> 255.255.255.255 17500 UDP
2016:10:26 11:07:38 :: 192.168.1.110 17500 --> 192.168.1.255 17500 UDP
2016:10:26 11:07:42 :: 192.168.1.169 57189 --> 192.168.1.38 53 UDP
2016:10:26 11:07:42 :: 192.168.1.169 26072 --> 192.168.1.38 53 UDP
2016:10:26 11:07:42 :: 192.168.1.169 41674 --> 199.30.228.113 80 TCP
2016:10:26 11:07:43 :: 192.168.1.169 41676 --> 199.30.228.113 80 TCP
2016:10:26 11:07:43 :: 192.168.1.169 7190 --> 192.168.1.38 53 UDP
2016:10:26 11:07:43 :: 192.168.1.169 30029 --> 192.168.1.38 53 UDP
2016:10:26 11:07:43 :: 192.168.1.169 41678 --> 199.30.228.113 80 TCP
2016:10:26 11:07:43 :: 192.168.1.169 64975 --> 192.168.1.38 53 UDP
2016:10:26 11:07:43 :: 192.168.1.169 12625 --> 192.168.1.38 53 UDP
2016:10:26 11:07:43 :: 192.168.1.169 29973 --> 192.168.1.38 53 UDP
2016:10:26 11:07:43 :: 192.168.1.169 53300 --> 216.58.211.4 443 TCP
2016:10:26 11:07:43 :: 192.168.1.169 41682 --> 199.30.228.113 80 TCP
.
.
.
执行过程中的进程列表:
ghasemi@ghasemi-MS-7693:~/Desktop/lwdpi_cpp$ ps ax | grep lwdpi
4685 pts/22 S+ 0:00 sudo ./lwdpi -i enp5s0
4686 pts/22 S+ 0:00 ./lwdpi -i enp5s0
4691 pts/21 S+ 0:00 grep --color=auto lwdpi
ghasemi@ghasemi-MS-7693:~/Desktop/lwdpi_cpp$
如上所示,执行后,将PID = 4685和PID = 4686的进程添加到进程列表中。为什么?我没有在其中调用我的程序!
当您这样做时:
sudo ./lwdpi -i enp5s0
sudo
是父进程,它fork(2)
是一个子进程,然后将execve(2)
其./lwdpi
作为可执行文件名
的子进程lwdpi
也是如此sudo
如您所见,这导致两个过程,一个是sudo
,另一个是lwdpi
。
查看详细信息的最好方法是也检查PPID(父进程ID):
ps -eo pid,ppid,args | grep '[l]wdpi'
您会看到lwdpi
的父代sudo
本身就是。
这是sudo
来自的流程模型man sudo
:
sudo运行命令时,它将调用fork(2),如上所述设置执行环境,并在子进程中调用execve系统调用。主sudo进程等待命令执行完毕,然后将命令的退出状态传递给安全策略的关闭功能并退出。
如果配置了I / O日志记录插件或安全策略明确请求它,则会创建一个新的伪终端(“ pty”),并使用第二个sudo进程在用户现有的pty和新的pty之间中继作业控制信号。 pty命令在其中运行。此额外的过程使例如挂起和恢复命令成为可能。没有它,该命令将成为POSIX所称的“孤立进程组”,并且它将不会接收任何作业控制信号。
在特殊情况下,如果策略插件未定义关闭函数并且不需要pty,则sudo将直接执行命令,而不是先调用fork(2)。sudoers策略插件仅在启用I / O日志记录,需要pty或启用pam_session或pam_setcred选项时定义关闭函数。请注意,默认情况下在使用PAM的系统上启用pam_session和pam_setcred。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句