Я записал программу, которая получает пакеты от сетевого интерфейса. Поскольку это слушает сетевой адаптер, я должен выполнить его с 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 = 4 686 добавленных к списку процессов. Почему? Я не сделал назвал мою программу в нем!
Когда Вы делаете:
sudo ./lwdpi -i enp5s0
sudo
родительский процесс, это fork(2)
s ребенок, которые затем делают execve(2)
с ./lwdpi
как исполняемое имя
так lwdpi
sudo
дочерний процесс
Это приводит к двум процессам, как Вы видите, каждый sudo
и другой lwdpi
.
Лучший способ видеть детали состоит в том, чтобы проверить PPID (идентификатор родительского процесса) также:
ps -eo pid,ppid,args | grep '[l]wdpi'
Вы будете видеть это lwdpi
родитель sudo
самостоятельно.
Вот sudo
модель процесса, от man sudo
:
Когда sudo выполняет команду, он называет ветвление (2), настраивает среду выполнения, как описано выше и называет execve системный вызов в дочернем процессе. Основной процесс sudo ожидает, пока команда не завершила, затем передает статус выхода команды близкой функции и выходам политики безопасности.
Если плагин входа ввода-вывода настроен или если политика безопасности явно запрашивает это, новый псевдотерминал (“имущество”) создается, и второй процесс sudo привык к релейным сигналам управления заданиями между существующим имуществом пользователя и новым имуществом, в котором выполняется команда. Этот дополнительный процесс позволяет, например, приостановите и возобновите команду. Без него команда была бы, в каком POSIX называет “осиротевшую группу процесса” и он не получил бы сигналов управления заданиями.
Как особый случай, если плагин политики не определяет близкую функцию и никакое имущество, требуется, sudo выполнит команду непосредственно вместо того, чтобы назвать ветвление (2) сначала. sudoers плагин политики только определит близкую функцию, когда вход ввода-вывода будет включен, имущество требуется, или pam_session или pam_setcred опции включены. Обратите внимание, что pam_session и pam_setcred включены по умолчанию в системах с помощью PAM.
Это происходит при запуске любого процесса с sudo
, Один процесс sudo
, программа и другой являются программой, запущенной с sudo
, который является дочерним процессом первого. sudo
программа выйдет только, когда процесс она будет работать за (его ребенок) выходы. Вот извлечение из моего pstree
при выполнении sudo apt update
├─mate-terminal─┬
├─bash───sudo───apt
child of bash--^ ^--child of sudo