セマフォを任意の値に設定するための関数 (Reset) と、それを呼び出したプロセスがセマフォがゼロになるまで待機させるための関数の 2 つの単純な関数を作成しました。
int R(int semid, int semnum, int val) // reset
{
union semun arg;
arg.val = val;
if( semctl(sem_id,semnum,SETVAL,arg) == -1 )
{
fprintf (stderr, "Errore inizializzazione del semaforo\n%s\n",
strerror(errno) );
}
}
int Z(int semid, int semnum) // wait for zero
{
printf("waiting for zero on %d\n",semid);
struct sembuf cmd;
cmd.sem_num = semnum;
cmd.sem_op = 0;
cmd.sem_flg = 0;
if(semop(semid, &cmd, 1)<0) {ERROR}
return 0;
}
これらの関数を次のようなコードとして使用しているプロセス:
while(1) {
R(sem_id_counter,0,N_PROC_DEFAULT); // (N_PROC_DEFAULT=5)
/* list of tasks not having anything to do with sem_id_coutner */
Z(sem_id_counter,0);
}
何が起こるかというと、上記のプロセスはループを実行し続けますが、関数 Z を呼び出すときに最後に停止させたいのですが、セマフォが 0 になるのを待ってから最初の内容にリセットして再起動します。
どこが間違っていますか?ありがとう [解決: semid の代わりに愚かなタイプミス sem_id ]