2015-03-21 2 views
0

Я пишу программу, которая должна создавать несколько процессов. Скажем, это число равно 3. Я хочу, чтобы каждый из этих процессов подсчитывал и выводил от 1 до 5 и спал в течение 1 секунды между каждым счетчиком/выходом. Я попытался сделать это следующим образом, но мой сон (1) не работал, как будто его прерывали. Я был бы признателен за некоторый опыт в этой теме, что я сделал не так, и как решить эту проблему. Вот мой код до сих пор.Создание нескольких процессов в C

/* 
* Creates N > 2 processes. 
*/ 
int main(int argc, const char * argv[]) 
{ 
    pid_t pid; 

    for(int i = 0; i < N_PROC; i++) { 
     pid = fork(); 
     if(pid == 0) { 
      ProcessWork(); 
      exit(0); 
     } 
    } 
} 


/* 
* Work of a single process. 
*/ 
void ProcessWork() { 
    char buffer[BUF_SIZE]; 
    for (int i = 1; i <= 5; i++) { 
     sleep(1); 
     sprintf(buffer, "PID = %d, count = %d\n", getpid(), i); 
     write(1, buffer, strlen(buffer)); 
    } 
} 
+1

Что означает «сон (1) не работает» означает? – immibis

+0

Ваш пример отлично работает здесь. Какова ваша проблема? –

+0

Multi-threaded - лучший вариант –

ответ

0

Ваш сон() работает точно так, как он должен работать. Однако ваша проблема заключается в том, что родительский процесс не ждет завершения дочерних процессов, поэтому родительский процесс завершается до того, как дети выполнили работу. Таким образом, это выглядит на системе Unix:

% ./a.out 
% PID = 41431, count = 1 
PID = 41430, count = 1 
PID = 41432, count = 1 
PID = 41431, count = 2 
PID = 41430, count = 2 
PID = 41432, count = 2 
PID = 41430, count = 3 
PID = 41431, count = 3 
PID = 41432, count = 3 
PID = 41430, count = 4 
PID = 41431, count = 4 
PID = 41432, count = 4 
PID = 41431, count = 5 
PID = 41430, count = 5 
PID = 41432, count = 5 

Вы должны посмотреть на странице руководства системного вызова ожидания(). Вы можете вызвать этот системный вызов в цикле, и он возвращает pid завершенного дочернего элемента, если есть дети, и -1 с errno == ECHILD, когда вы исчерпали детей. Этот ECHILD можно использовать в качестве критерия завершения цикла.

0

Дождитесь окончания процесса раздвоенной, если я понял вашу проблему ...

int main(int argc, const char * argv[]) 
{ 
    pid_t pid[N_PROC]; 

    for(int i = 0; i < N_PROC; i++) { 
     pid_t cur_pid = fork(); 
     if(cur_pid == 0) { 
      pid[i] = cur_pid; 
      ProcessWork(); 
      exit(0); 
     } 
    } 

    for(int i = 0; i < N_PROC; i++) 
     wait(&pid[i]); 
} 
Смежные вопросы