2017-05-01 4 views
0

私はセマフォーを扱っており、コードの一部で苦労しています。
CODE:sem_wait()を使用したCセマフォー

// semaphore initialized to zero 
for(int i = 0; i < N; i++) 
{ 
    fork(); 
    // statements 
    sem_wait(semaphore); 
    printf("Process %d is done\n", i); 
    exit(0); 
} 

for(int i = 0; i < N; i++) 
{ 
    sem_post(semaphore); 
} 

問題があり、そのループがあるためsem_waitの最初の繰り返しの後に停止し、私はそれが唯一のその現在のプロセスを停止したいと思いますので、他のすべての反復を行うことができるとの終わりにコード、私はすべてのプロセスを 'リリース'します。これを達成する方法はありますか?
ありがとうございます!

EDIT:

// initialization of semaphore 
semaphore = mmap(NULL, sizeof(sem_t), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0); 
sem_init(semaphore, 1, 0); 
+0

私たちに 'semarophe'変数をどのように初期化したかを教えてください。 –

+0

"現在のプロセス"の意味を説明できますか?その意味を説明したら、テストする必要があるものをテストする 'if'ステートメントで' sem_wait'を呼び出します。 –

+0

さて、forループでは 'fork()'をN回呼び出すので、N個のプロセスを作成します。現在のプロセスとは、繰り返しごとに各プロセスを意味します。 – SevO

答えて

1

フォーク戻り値をチェックしてください。それに基づいて、コードが子プロセスまたは親プロセスの下で実行されるかどうかを確認します。したがって、sem_waitを呼び出します。

関連する問題