Как получить имя процесса и идентификатор процесса вновь созданного дочернего процесса с помощью fork?

Я использую fork для создания дочернего процесса. Теперь я хочу узнать имя и идентификатор дочернего процесса, использующего шпатлевку. Какую команду мне нужно использовать, чтобы получить эту информацию. Я пытаюсь с ps и pstree. как можно указать имя дочернего процесса при создании нового дочернего процесса? Можно ли получить эту информацию с помощью любой команды linux/unix?

Я хочу знать, сколько времени ребенок активен и когда он прекращается. средняя информация о времени дочернего процесса.

root@mx6q:~# ps aux|grep "childprogram"
ps: invalid option -- 'a'
BusyBox v1.20.2 (2014-03-13 11:47:37 CET) multi-call binary.

Usage: ps

Show list of processes

        w       Wide output
        l       Long output
        T       Show threads

root@mx6q:~#



root@mx6q:~# ps | grep "childprogram"
 1407 root      1908 S    grep childprogram
root@mx6q:~# ps | grep "childprogram"
 1409 root      1908 S    grep childprogram
root@mx6q:~# ps | grep "childprogram"
 1411 root      1908 S    grep childprogram

Для родителя:

root@mx6q:~# readlink /proc/670/exe
.asoundrc                   .gvfs/
.bashrc                     adit-30-09-2014.vnclicense
.gstreamer-0.10/            enable_usb_dr_host_mode.sh
root@mx6q:~# readlink /proc/670/exe

но я не могу найти дочерний pid внутри /proc/? Что это означает?


person kapilddit    schedule 07.04.2014    source источник
comment
Попробуйте ps aux|grep дочерняя программа   -  person Mantosh Kumar    schedule 07.04.2014
comment
root@mx6q:~# ps aux|grep childprogram ps: недопустимая опция -- 'a' BusyBox v1.20.2 (2014-03-13 11:47:37 CET) двоичный файл с несколькими вызовами. Использование: ps Показать список процессов w Широкий вывод l Длинный вывод T Показать потоки root@mx6q:~#   -  person kapilddit    schedule 07.04.2014
comment
@Mantosh Это правильный путь или я делаю что-то не так... ??   -  person kapilddit    schedule 07.04.2014
comment
Я пробовал: root@mx6q:~# ps | grep childprogram 1407 root 1908 S grep childprogram root@mx6q:~# ps | grep childprogram 1409 root 1908 S grep childprogram root@mx6q:~# ps | grep дочерняя программа 1411 корень 1908 S grep дочерняя программа   -  person kapilddit    schedule 07.04.2014
comment
См. uofr.net/~greg/processname.html.   -  person John Zwinck    schedule 07.04.2014


Ответы (2)


Вы пометили это как C и упомянули, что вы являетесь субъектом, разветвляющим новый процесс, поэтому вся эта информация доступна вам в родительском процессе, который разветвляет дочерний процесс, но вам нужно изменить свой код, чтобы захватить ее.

  • У вас есть дочерний pid, потому что он возвращается в родительском fork.

  • Вы (вероятно) знаете имя ребенка, потому что в большинстве случаев именно вы написали exec звонок. Если нет, с pid ребенка вы можете readlink /proc/<pid>/exe.

  • Если вам нужно узнать статистику ребенка во время его работы, вы можете вызвать getrusage с параметром RUSAGE_CHILDREN.

  • Если вам нужна только статистика ребенка после ее завершения, вы можете подождать ее с помощью wait4.
person Duck    schedule 07.04.2014
comment
Я делаю все эти упражнения, потому что всегда получаю возвращаемое значение -1 от waitpid с ошибкой ECHILD. Есть ли способ отладить, почему он терпит неудачу? Я пробовал оба варианта: //pid_t returnValue = waitpid(Checksum_pid, &childStatus, 0); //pid_t returnValue = waitpid(Checksum_pid, &childStatus, WNOHANG); - person kapilddit; 07.04.2014
comment
Я использовал readlink /proc/pid/exe, но не могу найти дочерний pid в списке. что это означает. родительский pid доступен? У меня есть обновление в моем вопросе. - person kapilddit; 07.04.2014
comment
Эти вызовы выглядят нормально сами по себе, что предполагает наличие ошибки где-то в окружающем контексте. Вы должны сократить код до минимально необходимого примера и отправить другой вопрос. Вероятно, это что-то простое, но по этому просто невозможно сказать. - person Duck; 07.04.2014
comment
Вы установили SIGCHLD в SIG_IGN? - person Duck; 07.04.2014
comment
Нет, как я могу это сделать? Я не знаю об этом. не могли бы вы дать мне ссылку на образец реализации? - person kapilddit; 07.04.2014
comment
На самом деле вы не хотите этого делать. См. раздел «Примечания» к man waitpid. - person Duck; 07.04.2014

Попробуй это:

$ ps xf

И проанализируйте вывод и сделайте несколько фильтров с помощью grep sed и/или awk.

Я не очень хорошо знаком с BusyBox, так как знаю, что это крошечный дистрибутив с ограниченными функциями.

person kpopovbg    schedule 07.04.2014
comment
-1. BusyBox — это не крошечный дистрибутив. Это библиотека с несколькими вызовами, реализующая многие стандартные инструменты POSIX. - person Daniel Kamil Kozar; 02.05.2014