какой будет PID после fork()?

Я делаю 3 последовательных разветвления в программе C.
1. Будет ли она выполняться в том же порядке? (Я предполагаю, что да).
2. Если я выполню pgrep myexecutable из оболочки, выдаст ли она идентификаторы процессов в том же порядке, в котором они были запущены? (я думаю, что нет, потому что вы не можете гарантировать, какой pid система дает ребенку, верно?)


person Shrinath    schedule 15.02.2011    source источник
comment
Это не должно иметь значения для любой разумной программы.   -  person Lightness Races in Orbit    schedule 15.02.2011
comment
PID последнего разветвленного процесса: $! stackoverflow.com/a/25361436/6655092... Я нашел этот вопрос, на самом деле глядя для $!, поэтому я решил опубликовать это здесь.   -  person JakeD    schedule 26.05.2018


Ответы (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).

person Lee Hambley    schedule 15.02.2011
comment
Пожалуйста, повторите вопрос еще раз и скажите мне, какая часть вопроса не ясна... Я не спрашиваю, как создать дочерний процесс или как узнать pid дочернего процесса... Все, что я прошу, это будет ли это в том же порядке каждый раз? Спасибо за ваше драгоценное время - person Shrinath; 15.02.2011

Всего будет запущено 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
person ayush    schedule 15.02.2011