セマフォの課題なんですが・・・
Posted: 2007年7月16日(月) 01:00
大学の課題でセマフォに関するものが出たのですがよくわからなくて・・・
セマフォを使って親プロセスと子プロセスを同期させてメッセージ通信をさせるというものです。
親プロセスで書き込んだものが子プロセスで表示され、そして子プロセスで書き込まれたものが親プロセスで表示されるという流れです。
以下のようなプログラムを書いたのですが、親プロセス内でしかやりとりをしてくれない状態です。
これのどこをどのようになおしたら良いのか教えていただけないでしょうか・・・?
よろしくお願いします
/* (#include &各種宣言)*/
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/shm.h>
struct sembuf p2c[1],c2p[1];
union semun {
int val;
struct semid_ds *buf;
unsigned short *array;
struct seminfo *__buf;
}arg;
int main() {
/* (共有バッファ(128B)の確保)*/
int smid,p2csemid,c2psemid,pid;
int *smad;
if((smid=shmget(IPC_PRIVATE,128,IPC_CREAT|0666))==-1){
perror("shm get ");
}
if((smad=shmat(smid,0,0))==(int *)(-1)){
perror("shm attach ");
}
/* p2c:親→子メッセージ用セマフォ c2p:子→親用セマフォ */
if((p2csemid=semget(IPC_PRIVATE,1,0600))==-1){
perror("p2csem get ");
}
if((c2psemid=semget(IPC_PRIVATE,1,0600))==-1){
perror("c2psem get ");
}
arg.val=0;
if((semctl(p2csemid,0,SETVAL,arg))==-1){
perror("p2csem initialize ");
}
if((semctl(c2psemid,0,SETVAL,arg))==-1){
perror("c2psem initialize ");
}
p2c[0].sem_num=0;
p2c[0].sem_flg=0;
c2p[0].sem_num=0;
c2p[0].sem_flg=0;
if((pid=fork())==0){
for(;;){
/* 親の書き込み待ち */
p2c[0].sem_op=-1;
if((semop(p2csemid,p2c,1))==-1){
perror("child r_lock ");
}
/* ・(親からのメッセージのバッファからの読み出し)*/
printf( "parent:%s\n", smad );
/* ・(親へのメッセージのバッファへの書き込み)*/
scanf( "%s", smad );
/* 親の読み出し待機解除 */
c2p[0].sem_op=1;
if((semop(c2psemid,c2p,1))==-1){
perror("child w_unlock ");
}
/* ・(以下、親のプロセス)*/
}} else {
sleep(1);
for(;;){
/* ・(子へのメッセージのバッファへの書き込み)*/
scanf( "%s", smad );
/* ・(子の読み出し待機解除)*/
p2c[0].sem_op=1;
if((semop(p2csemid,p2c,1))==-1){
perror("parent w_unlock ");
}
/* ・(子の書き込み待ち)*/
c2p[0].sem_op=-1;
if((semop(c2psemid,c2p,1))==-1){
perror("parent r_lock ");
}
/* ・(子からのメッセージのバッファからの読み出し)*/
printf( "child:%s\n", smad );
}
}
return 0;
}
セマフォを使って親プロセスと子プロセスを同期させてメッセージ通信をさせるというものです。
親プロセスで書き込んだものが子プロセスで表示され、そして子プロセスで書き込まれたものが親プロセスで表示されるという流れです。
以下のようなプログラムを書いたのですが、親プロセス内でしかやりとりをしてくれない状態です。
これのどこをどのようになおしたら良いのか教えていただけないでしょうか・・・?
よろしくお願いします
/* (#include &各種宣言)*/
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/shm.h>
struct sembuf p2c[1],c2p[1];
union semun {
int val;
struct semid_ds *buf;
unsigned short *array;
struct seminfo *__buf;
}arg;
int main() {
/* (共有バッファ(128B)の確保)*/
int smid,p2csemid,c2psemid,pid;
int *smad;
if((smid=shmget(IPC_PRIVATE,128,IPC_CREAT|0666))==-1){
perror("shm get ");
}
if((smad=shmat(smid,0,0))==(int *)(-1)){
perror("shm attach ");
}
/* p2c:親→子メッセージ用セマフォ c2p:子→親用セマフォ */
if((p2csemid=semget(IPC_PRIVATE,1,0600))==-1){
perror("p2csem get ");
}
if((c2psemid=semget(IPC_PRIVATE,1,0600))==-1){
perror("c2psem get ");
}
arg.val=0;
if((semctl(p2csemid,0,SETVAL,arg))==-1){
perror("p2csem initialize ");
}
if((semctl(c2psemid,0,SETVAL,arg))==-1){
perror("c2psem initialize ");
}
p2c[0].sem_num=0;
p2c[0].sem_flg=0;
c2p[0].sem_num=0;
c2p[0].sem_flg=0;
if((pid=fork())==0){
for(;;){
/* 親の書き込み待ち */
p2c[0].sem_op=-1;
if((semop(p2csemid,p2c,1))==-1){
perror("child r_lock ");
}
/* ・(親からのメッセージのバッファからの読み出し)*/
printf( "parent:%s\n", smad );
/* ・(親へのメッセージのバッファへの書き込み)*/
scanf( "%s", smad );
/* 親の読み出し待機解除 */
c2p[0].sem_op=1;
if((semop(c2psemid,c2p,1))==-1){
perror("child w_unlock ");
}
/* ・(以下、親のプロセス)*/
}} else {
sleep(1);
for(;;){
/* ・(子へのメッセージのバッファへの書き込み)*/
scanf( "%s", smad );
/* ・(子の読み出し待機解除)*/
p2c[0].sem_op=1;
if((semop(p2csemid,p2c,1))==-1){
perror("parent w_unlock ");
}
/* ・(子の書き込み待ち)*/
c2p[0].sem_op=-1;
if((semop(c2psemid,c2p,1))==-1){
perror("parent r_lock ");
}
/* ・(子からのメッセージのバッファからの読み出し)*/
printf( "child:%s\n", smad );
}
}
return 0;
}