2015-02-05 4 views
1

Итак, я пытался понять вилки, и хотя я понимаю основы (т. Е. Другой процесс создается с копией оригинала когда мы используем fork()), я не могу по-настоящему понять, что происходит с создаваемыми процессами.Как использовать каждый процесс при использовании двух fork() в C

Например: Мне нужно написать программу, которая будет называть fork() дважды, чтобы создать всего 4 процесса. Когда один процесс создается, я должен распечатать pid с помощью getpid(). После распечатки четырех идентификаторов моя программа должна печатать одну букву 10 раз.

Например, родительский 1 будет печатать 'A', для потомка 1 будет напечатано 'B', дочерний 2 будет печатать 'C', а родительский элемент будет печатать 'D'. Для этого я должен использовать putchar(ch); и вывести вывод с fflush(stdout).

Это означает, что выход будет выглядеть следующим образом:

Process created, ID: 3856 
Process created, ID: 3857 
Process created, ID: 3858 
Process created, ID: 3859 
AAAAAABBBBBBBCDCDCDCDCDCDCBBBDCDCAAAADCD 

До сих пор я получил четыре процессы для печати с этим кодом:

int main(void) { 
    pid_t child1, child2; 
    child1 = fork(); 
    child2 = fork(); 
    printf("Process created. ID: %d\n", getpid()); 
} 

Но я не знаю, как использовать wait(), чтобы все распечатывалось случайно, после того, как я напечатал идентификаторы.

Чтобы получить все, что мне нужно для распечатки, чтобы быть «случайным беспорядком», что мне делать? Должен ли я вызвать такие функции?

// in main 
for(int i = 0; i < 10; ++i) { 
    char_parent1(); 
    char_child1(); 
    char_parent2(); 
    char_child2(); 
} 
return 0; 
} 

void char_parent1() 
{ 
    putchar('A'); 
    fflush(stdout); 
} 

void char_child1() 
{ 
    putchar('B'); 
    fflush(stdout); 
} 

// and so on for char_parent2() and char_child2() 

В том случае, если мой профессор говорит, что я в основном печатать вещи одновременно и случайным образом, то почему я должен использовать wait()?

+0

так, где вы печатаете символ? отправьте код –

+0

Прочитайте [Advanced Linux Programming] (http://advancedlinuxprogramming.com/), в котором есть несколько глав, чтобы ответить на ваши вопросы. –

+0

@simon_xia Я добавил пример того, что, я думаю, должен делать .. возможно. – Alex

ответ

2

Каждый процесс должен знать, какую букву он должен печатать. Это означает, что вам необходимо проанализировать значения в child1 и child2. Например, один процесс имеет два нуля; он может распечатать D.

Возможно, каждый процесс должен знать, является ли он родителем или нет. Если он не является родителем, он может просто выйти после печати 10 копий своего письма, за которым следует fflush(). Если это родитель, после ожидания, пока его дети умрут, он должен выйти. Это означает, что исходный процесс завершится последним. Это могло бы полезно выводить новую строку после того, как ее последний ребенок умер. Вы можете или не будете печатать диагностическую информацию о мертвых детях по ходу дела.

+0

Благодарим вас за помощь. Я принял ваш совет и получил его на работу :) – Alex

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