2013-02-10 1 views
3

Каков правильный способ рассказать о конкретном процессе сна? Я не совсем понимаю, как управлять различными процессами, которые я создаю.Создайте процесс и скажите ему спать?

Я пытаюсь сделать два процесса, которые спят на 2 и 3 секунды. Когда процесс 1 спал в течение 2 секунд, а процесс 2 все еще спящий, я хочу, чтобы процесс 3 начал спать. Но как я могу описать процесс сна? Или не так ли?

int main(void) 
{ 
    pid_t p1 = fork(); 
    pid_t p2 = fork(); 
    pid_t p3 = fork(); 

    //make p1 sleep(2) and p2 sleep(3) 
    waitpid(p1, NULL, 0); //waiting for p1 to terminate 
    //make p3 sleep(2); 
} 

Как вы можете видеть, я не понимаю, как обрабатывать процессы или что они на самом деле есть. Я вроде как рассматриваю их как объекты, но я предполагаю, что это неправильно. Я пробовал прочесть кое-что об этом, но на них написано более 9000 страниц PDF. Простое объяснение того, что я должен их увидеть, будет оценено , И да, это школьный материал, но нет, это не задание.

ответ

5

Начинается с man fork, который немного короче 9000 страниц. Главное, что успешный fork возвращает два раза: он возвращает 0 к дочернему процессу и ПИД ребенка в родительский процесс. Обычно используется так:

pid_t pid = fork(); 
if (pid<0) { /* error while forking */ 
}; 
if (!pid) { /* code for child */ 
    play(); 
    whine(); 
    sleep(); 
    exit(0); 
} else { /* code for parent */ 
    grunt(); 
    waitpid(...); 
} 

Вы обычно не сказать дочерний процесс, чтобы сделать это, и что вы просто добавить код делает его в соответствующий if отрасли.

В вашем примере, если все вилки успешно, вы в конечном итоге с процессов:

  1. Первой вилка создает новый процесс, p1 получает 0 в новом процессе и некоторые ИКА в родителе.
  2. Вторая вилка называется как в исходном родительском, так и в дочернем, добавляя к процессу 2 процесса. p2 получает 0 во всех «внуков» и двух различных PIDs в существующих перед шагом 2.
  3. Третья вилка называется в четыре различных процессов 2 процессов, добавив четыре других процессов к картине.
+0

Oh! Теперь я понимаю, спасибо! – Sti

4

Вы можете отправить его SIGSTOP, а затем SIGCONT Я думаю.

kill(p1, SIGSTOP); 

Альтернативно и более здраво, так как вы только разветвление и, таким образом, имеют полный проверочные над кодом, вы можете обрабатывать пути:

if (in_child_1) 
    sleep(..); 

В качестве примечания, в вашем код больше процессов создается, чем вы ожидаете. Дело в том, что p1 создан начинает с этой точки, параллельно с его родителем. И так далее.

+0

Невозможно разрешить дочерний процесс 'sleep (i)' в то время как другие дочерние процессы работают? И да, я заметил раньше, что они выглядят как бы экспоненциально на меня, почему? Думаю, мне придется читать на fork .. – Sti

Смежные вопросы