セマフォの使い方
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
]
開始行:
* セマフォの使い方 [#fee4c59d]
Linuxで、C言語を用いてセマフォを活用する方法を、記述しま...
セマフォとは、プロセスやスレッドの同時実行を制御するため...
ちなみにLinuxには、SystemVとPOSIXのセマフォがあり、両者は...
以下の例は、acceptor内で任意の数の子プロセスを生成し、子...
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#define PROCESS_MAX 5
// semctlのコマンド用(開発者がソース内で定義しなくては駄...
union semun {
int val;
struct semid_ds *buf;
unsigned short *array;
struct seminfo *_buf;
};
void transport(int sem) {
int res = 0;
struct sembuf semb; // semop へ渡す設定内容の構造体
semb.sem_num = 0;
semb.sem_op = -1; // セマフォから権限を取得する
semb.sem_flg = SEM_UNDO;
res = semop(sem, &semb, 1);
printf("tansport started\n");
sleep(2);
printf("tansport finished\n");
semb.sem_num = 0;
semb.sem_op = 1; // セマフォから得た権限を返還する
semb.sem_flg = SEM_UNDO;
res = semop(sem, &semb, 1);
}
void acceptor() {
int res = 0;
int i = 0;
int sem;
union semun semcmd; // semctl へ渡すコマンド用の共用体
// セマフォを取得する
sem = semget(IPC_PRIVATE, 1, 0666|IPC_CREAT);
// セマフォに初期値を設定する(この値が、同時実行を許...
semcmd.val = 1;
res = semctl(sem, 0, SETVAL, semcmd);
while(i < PROCESS_MAX) {
int pid;
pid = fork(); // fork システムコールで、子プロセ...
switch(pid) {
case 0: // 子プロセスの場合に実行する
transport(sem);
exit(0); // 子プロセスはここで終了する
break;
}
// 親プロセスは処理を続行する
i++;
}
}
int main() {
acceptor();
}
本来は、acceptorの中で、前の子プロセスによるtransport処理...
とにかく今回二日ほど試行してみて感じたことは、セマフォは...
----
** 履歴 [#vace5ac2]
- 2005/09/04 初版
終了行:
* セマフォの使い方 [#fee4c59d]
Linuxで、C言語を用いてセマフォを活用する方法を、記述しま...
セマフォとは、プロセスやスレッドの同時実行を制御するため...
ちなみにLinuxには、SystemVとPOSIXのセマフォがあり、両者は...
以下の例は、acceptor内で任意の数の子プロセスを生成し、子...
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#define PROCESS_MAX 5
// semctlのコマンド用(開発者がソース内で定義しなくては駄...
union semun {
int val;
struct semid_ds *buf;
unsigned short *array;
struct seminfo *_buf;
};
void transport(int sem) {
int res = 0;
struct sembuf semb; // semop へ渡す設定内容の構造体
semb.sem_num = 0;
semb.sem_op = -1; // セマフォから権限を取得する
semb.sem_flg = SEM_UNDO;
res = semop(sem, &semb, 1);
printf("tansport started\n");
sleep(2);
printf("tansport finished\n");
semb.sem_num = 0;
semb.sem_op = 1; // セマフォから得た権限を返還する
semb.sem_flg = SEM_UNDO;
res = semop(sem, &semb, 1);
}
void acceptor() {
int res = 0;
int i = 0;
int sem;
union semun semcmd; // semctl へ渡すコマンド用の共用体
// セマフォを取得する
sem = semget(IPC_PRIVATE, 1, 0666|IPC_CREAT);
// セマフォに初期値を設定する(この値が、同時実行を許...
semcmd.val = 1;
res = semctl(sem, 0, SETVAL, semcmd);
while(i < PROCESS_MAX) {
int pid;
pid = fork(); // fork システムコールで、子プロセ...
switch(pid) {
case 0: // 子プロセスの場合に実行する
transport(sem);
exit(0); // 子プロセスはここで終了する
break;
}
// 親プロセスは処理を続行する
i++;
}
}
int main() {
acceptor();
}
本来は、acceptorの中で、前の子プロセスによるtransport処理...
とにかく今回二日ほど試行してみて感じたことは、セマフォは...
----
** 履歴 [#vace5ac2]
- 2005/09/04 初版
ページ名: