Я делаю 3 последовательных разветвления в программе C.
1. Будет ли она выполняться в том же порядке? (Я предполагаю, что да).
2. Если я выполню pgrep myexecutable
из оболочки, выдаст ли она идентификаторы процессов в том же порядке, в котором они были запущены? (я думаю, что нет, потому что вы не можете гарантировать, какой pid система дает ребенку, верно?)
какой будет PID после fork()?
Ответы (2)
Шринат, ты должен проверить документацию по fork()
, вот она:
Upon successful completion, fork() returns a value of 0 to the child process and returns the process ID of the child process to the parent process. Otherwise, a value of -1 is returned to the parent process, no child process is created, and the global variable errno is set to indi- cate the error.
Все, что это значит для вас, это то, что ваш родительский процесс получит PID дочернего процесса, когда он разветвится. Ребенок знает, что это ребенок, потому что fork()
вернет 0 ребенку, поэтому что-то вроде:
if((cpid = fork())) { // This is the parent processs, child pid // is in `cpid` variable }else{ // This is the child process, do your child // work here. }
Остерегайтесь возможности получить отрицательное число (значит, ребенка нет), вы должны проверить это.
Вывод ps
зависит от системы, но вы должны увидеть пример, если посмотрите на все дерево (переведите процессы в спящий режим, чтобы у вас было время проверить вывод ps
).
Всего будет запущено 8 процессов после выполнения 3 форков.
так что теперь pid будет зависеть от того, в каком порядке создается дочерний процесс, а также в каком порядке создаются дочерние элементы.
может быть как
main - 12345
child1_of_main_after_fork1 12346
child2_of_child1_after_fork2 12347
child3_of_main_after_fork2 12348
child4_of_main_after_fork3 12349
child5_of_child1_after_fork3 12350
child6_of_child2_after_fork3 12351
child7_of_child3_after_fork3 12352
$!
stackoverflow.com/a/25361436/6655092... Я нашел этот вопрос, на самом деле глядя для$!
, поэтому я решил опубликовать это здесь. - person JakeD   schedule 26.05.2018