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

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

4 голосов
/ 15 февраля 2011

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

Ответы [ 2 ]

5 голосов
/ 15 февраля 2011

Было бы в общей сложности 8 процессов, запущенных после того, как 3 форка были выполненыв каком порядке создаются дети детей.

может быть как

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
3 голосов
/ 15 февраля 2011

Shrinath, вы должны проверить документацию для 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).

...