2017-04-05 28 views
0

私はP3、P1、P2の順番でプログラムを実行する必要がある親プロセスを含む3つのプロセスがあるとします。プロセスP3から計算を開始する方法を教えてください。セマフォを使用してプロセスを同期させる方法

私は私のコードのスナップショットは参考のため、{0,1,2,3,4,5、...最大}

としてアウトが必要: -

#define SEM_NAME "//test.mutex" 
//#define SEM_NAME2 "//test2.mutex" 

int main(int argc, char const *argv[]) { 
    int max = 0, i =0; 
    sem_t *sem; 
    sem_t *sem2; 
    pid_t pid, pid2; 
    sem = sem_open(SEM_NAME, O_CREAT, O_RDWR, 1); 
    sem_unlink(SEM_NAME); 
    if (sem==SEM_FAILED) { 
    printf("%s sem_open failed!", SEM_NAME); 
    return (-1); 
    } 
    // sem2 = sem_open(SEM_NAME2, O_CREAT, O_RDWR, 0); 
    // sem_unlink(SEM_NAME2); 
    // if (sem2==SEM_FAILED) { 
    // printf("%s sem_open failed!", SEM_NAME2); 
    // return (-1); 
    // } 
    printf("Enter the maximum number\n"); 
    scanf("%d", &max); 
    pid = fork(); 
    if(pid == 0) 
    { 
    i = 2; 
    pid2 = fork(); 
    if(pid2 == 0) 
    { 
     i = 0; 
    } 
    else 
    { 
     sleep(2); 
    } 
    } 
    else 
    { 
    i = 1; 
    sleep(1); 
    } 
    //do 
    { 
    sem_wait(sem); 
    for (; i <= max;) { 
     printf("pid %d done and value is %d\n", getpid(),i); 
     i = i + 3; 
    } 
    sem_post(sem); 
    } //while(i <= max); 
    wait(NULL); 
    return 0; 
} 

私が実行したときプログラム私は次の出力を得ます {0,3、、6,1,4,7,2,5,8}

最初のプロセスで数値を出力する方法が必要です。彼の番号と最後の3分の1が印刷されます。

私はそれぞれが順番に向きを変える方法が必要です。

希望は私は質問で明らかだ

答えて

0

ここでは、順序P3、P1達成できるかの擬似コードは、

//semaphores for P1, P2, P3 respectively 
semaphore s1=0; 
semaphore s2=0; 
semaphore s3=1;  //coz P3 needs to go first 


//for p3 
wait(s3) 
    //do p3 here 
signal(s1)   //signal for P1 to start 


//for p1 
wait(s1) 
    //do p1 
signal(s2)   // signal to start P2 


//for p2 
wait(s2) 
    //do p2 
signal(s3)   //signal to start p3 again if that is required or you can omit this if not required 
P2
です
関連する問題