2012-05-16 2 views
1

необходимы два дочерних процесса, чтобы сделать это:Синхронизация поочередно два процесса в Linux C

  • процесс по уходу за детьми 1 должен printf четные числа от 0 до 100.
  • процесса ребенка 2 должен printf нечетные числа между 0 и 100.

Что я должен видеть в терминале после выполнения является: 0 1 2 4..100

Как может Я делаю это?

Я попробовал эту программу, но она не работает, он только дает мне первое целое число 0:

#include <unistd.h> 
#include <stdio.h> 
#include <signal.h> 

void handler1(int sig) 
{ 
    if(sig == SIGCONT) 
    { 
    raise(SIGCONT); 
    } 
} 

void handler2(int sig) 
{ 
    if(sig == SIGCONT) 
    { 
    raise(SIGCONT); 
    } 
} 

int main() 
{ 
    int i=-1; 

    if(fork()==0) 
    { 
    signal(SIGCONT,handler1); 
    while(1) 
    { 

     printf("%d\n",i+1); 
     pause(); 
     kill(getpid()+1,SIGCONT); 
    } 
    } 

    if(fork()==0) 
    { 
    signal(SIGCONT,handler2); 
    while(1) 
    { 
     pause(); 

     printf("%d\n",i+1); 
     kill(getpid()-1,SIGCONT); 
    } 
    } 

} 
+1

'0 1 2 4..100'? –

+1

zillions of problems .. напечатайте некоторые отладочные сообщения и (надеюсь) ... вы увидите, что происходит –

ответ

2

сигналы не является хорошим решением этой проблемы. Первый сигнал теряется (он отправляется первым ребенком до начала второго ребенка), и вы в конечном итоге заблокированы (потому что один из процессов ожидает сигнала, который он уже пропустил).

Попробуйте вместо этого использовать семафоры или очереди сообщений. Они невосприимчивы к этой проблеме, потому что они не теряются в системе, даже если не все запущенные процессы уже запущены.

+0

Я вижу. Однако я немного смущен, потому что это было дано как домашнее задание с просьбой сделать синхронизацию, используя exit/wait или используя сигналы, о которых мы узнали до сих пор. Я еще не знаю, как использовать семафоры или очереди сообщений. Есть ли возможность использовать их? Спасибо за ваш ответ. – user1398371

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