【初心者歓迎】C/C++室 Ver.24【環境依存OK】

このエントリーをはてなブックマークに追加
312デフォルトの名無しさん
セマフォをつかって、ある処理に関してロック、アンロックの処理が
したい場合、ソースは以下のようなかんじ問題ないですか?
※以下のプログラムを2つ同時に動かした場合、
セマフォの開放は1つ目のプロセスによって行われているので、
2つ目のプロセスはIPC_RMIDの際に、エラーが出てしまいますよね。
これって、基本的にはどうするといいんですかね?

313デフォルトの名無しさん:2005/11/19(土) 20:32:18
C言語と何の関係が?
314デフォルトの名無しさん:2005/11/19(土) 20:32:38
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> 
#include <sys/sem.h>
union semun { int val;
struct semid_ds *buf; unsigned short int *array;
struct seminfo *__buf; };
int lock(int argc, char *argv[]) {
union semun semaphore_union;
struct sembuf semaphore_buffer;
int semaphore_id;
semaphore_id = semget((key_t)1000, 1, 0666 | IPC_CREAT);
semaphore_union.val=1; //sem init
if ( semctl(semaphore_id, 0, SETVAL, semaphore_union) != 0 ) {
exit(1); } //lock
semaphore_buffer.sem_num = 0;
semaphore_buffer.sem_op = -1;
semaphore_buffer.sem_flg = SEM_UNDO;
if ( semop(semaphore_id, &semaphore_buffer, 1) == -1 ) {
exit(1);  }
sleep(30) // 何かの処理の変わり  //unlock
semaphore_buffer.sem_num = 0;
semaphore_buffer.sem_op = -1;
semaphore_buffer.sem_flg = SEM_UNDO;
if ( semop(semaphore_id, &semaphore_buffer, 1) == -1 ) {
exit(1);
}
//sem end
if ( semctl(semaphore_id, 0, IPC_RMID, semaphore_union) != 0 ) {
exit(1);
}
return(0);
}
315デフォルトの名無しさん:2005/11/19(土) 20:34:36
//sem end
if ( semctl(semaphore_id, 0, IPC_RMID, semaphore_union) != 0 ) {
exit(1);
}
 この際に、一つめのプロセスが既に削除しているので、
 2つ目のプロセスでは、エラーが帰ってきてしまいます。
 基本的にセマフォの扱いって、どう記述するものなんですか。
316デフォルトの名無しさん:2005/11/19(土) 20:45:23
正しいやり方かはわからないが。
@プロセス1の処理が終わったら、セマフォに「プロセス1終わったよ」書き込む。
A「プロセス1終わったよ」になるまで待機してから、
 「プロセス2も終わったよ」を書き込んでから、プロセス2を削除。
B「プロセス2も終わったよ」を確認してから、プロセス1を削除
317315:2005/11/19(土) 22:00:29
>>316
 それぞれのプロセスをIPC_RMIDさせる直前までwait させろってことですよね。
  そのケースは、事前に立ち上がるプロセス数(たとえば、自分で
  fork して作成したプロセス)が分かっている場合、有効ですよね。
 
 何個のプロセスがあがるか分からないときの手段としては、
 IPC_RMID させる時は、手動で打つがいいのかな。