【初心者歓迎】C/C++室 Ver.24【環境依存OK】
312 :
デフォルトの名無しさん:
セマフォをつかって、ある処理に関してロック、アンロックの処理が
したい場合、ソースは以下のようなかんじ問題ないですか?
※以下のプログラムを2つ同時に動かした場合、
セマフォの開放は1つ目のプロセスによって行われているので、
2つ目のプロセスはIPC_RMIDの際に、エラーが出てしまいますよね。
これって、基本的にはどうするといいんですかね?
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を削除
317 :
315:2005/11/19(土) 22:00:29
>>316 それぞれのプロセスをIPC_RMIDさせる直前までwait させろってことですよね。
そのケースは、事前に立ち上がるプロセス数(たとえば、自分で
fork して作成したプロセス)が分かっている場合、有効ですよね。
何個のプロセスがあがるか分からないときの手段としては、
IPC_RMID させる時は、手動で打つがいいのかな。