Похоже, что нет способа регистрации этой информации, и если рассмотреть это более подробно, то это будет трудно спроектировать правильно (я сначала думал, что это будет трудно реализовать, но ilkkachu исправил это).
Я думал, что проблема реализации заключается в регистрации информации в нужном месте. Когда оболочка запускает дочерний процесс, она форкает, а затем выполняет дочерний процесс (если только она не может заменить себя дочерним процессом, в этом случае она не форкает). При форке процесс дублируется; одна из копий получает код возврата 0 от вызова fork()
, что указывает на то, что она дочерняя, а другая получает идентификатор дочернего процесса, что указывает на то, что она родительская. Дочерний процесс наследует файловые дескрипторы родительского, поэтому он может регистрировать свой собственный pid перед настройкой для exec()
.
Проблема проектирования заключается в выборе того, что регистрировать. Если мы будем регистрировать все процессы, запускаемые оболочкой, то в итоге получим множество лишних журналов, например, для процессов, участвующих в создании подсказки! Даже для "настоящих" команд нам нужно решить, что регистрировать для конвейеров и других составных команд... А затем для согласованности нам нужно придумать, что регистрировать для встроенных команд или для обстоятельств, когда оболочка заменяет себя дочерней (хотя я не думаю, что это может произойти в интерактивной оболочке, если только вы вручную exec
).
Если вы хотите изучить это подробнее, посмотрите addproc()
и printjobs()
в jobs.c
, и zexecve()
в exec.c
.