Системные вызовы в Strace - PullRequest
       27

Системные вызовы в Strace

0 голосов
/ 23 февраля 2012

Я позвонил strace в какую-то программу A, которая разветвляет две дочерние программы: B и C.

В strace у меня есть следующее syscalls:

 pipe[([3,4]) = 0
 pipe([5,6]) = 0
 fork(wc) = 7135
 fork (gnetcat) = 7136
 close(3) = 0
 close(5) = 0
 close(4) = 0
 close(6) = 0
 wait4(-1, NULL, 0, NULL) = 7136
 wait4(-1, NUKLL, 0, NULL) = 7135

Я пытаюсь переписать программу A на C. В этом случае мне действительно никогда не нужно знать, что стоят эти файловые дескрипторы 3, 4, 5 и 6для, я?Есть ли способ узнать, кто они?Я знаю, 3 для stderr.

Ответы [ 2 ]

1 голос
/ 13 июня 2013

Вы должны попробовать запустить strace снова с флагом -f, чтобы он следовал за вилками. На данный момент вы можете видеть только то, что делает ваш процесс верхнего уровня, вы не можете видеть, что делают ваши дочерние процессы.

Процесс верхнего уровня создает две трубы. Трубы используются программами для общения друг с другом. Первый канал имеет конец чтения на fd 3 и конец записи на fd 4. Второй канал имеет конец чтения на fd 5 и конец записи на fd 6.

Поскольку программа верхнего уровня закрывает все четыре fds после вызова двух дочерних программ, похоже, что они просто используются внутренне дочерними программами (которые обе получают копии fds). Это необычно, потому что обычно я ожидаю увидеть, как родительский процесс будет держать один открытый, чтобы общаться с ребенком. Похоже, что в вашей трассировке отсутствует важная информация о том, что происходило с fds после каждого форка.

Это то, что я ожидал бы увидеть, если бы процесс открывал каналы для того, чтобы захватить stdout от потомка, например:

parent_pid: pipe[3,4]
parent_pid: clone() = child_pid
parent_pid: close(4)
child_pid:  dup(4,1)
child_pid:  close(4)
child_pid:  close(3)
child_pid:  execve(some program)
child_pid:  write(1)
parent_pid: read(3)
parent_pid: wait(child_pid)
child_pid:  exit()
0 голосов
/ 23 февраля 2012

0 - STDIN, 1 - STDOUT, 2 - STDERR.Все более высокие цифры до приложения.В этом случае я подозреваю, что они используются для захвата stdout / stderr недавно разветвленных программ.Это будет означать, что "wc", вероятно, работает с его stdout, подключенным к fd 3, и stderr к fd 4, поэтому основное приложение может выводить wc.

...