2009-05-18 13 views
2

私はposix共有メモリとposix unnamed semaphoresを使ってpshared = 1のクライアントサーバアプリケーションを構築しました。セマフォは共有メモリ内に置かれます。プログラムは正常に動作しますが、ipcs -mまたはipcs -sと入力すると、作成した共有メモリセグメントやセマフォは表示されません。それはなぜそうですか?なぜいくつかのposix共有メモリセグメントとposixセマフォがipcsに見えない

/* Server main function for implementing client server program using Posix Shared Memory and Posix Unnamed Semaphores*/ 
#include "shm_sem.h" 
int main(int argc,char ** argv) 
{ 
    int fd; 
    struct shmstruct *ptr; 
    shm_unlink(MYSHM); // delete shared memory segment, if it already exists  
    /* create shared memory, set its size, map it and close descriptor */ 
    fd=shm_open(MYSHM,O_RDWR|O_CREAT|O_EXCL,0777); 
    ptr=mmap(NULL,sizeof(struct shmstruct),PROT_READ|PROT_WRITE,MAP_SHARED,fd,0); 
    // truncate the size of shared memory to the size of shmstruct 
    ftruncate(fd,sizeof(struct shmstruct)); 
    close(fd); 
    // initialize the semaphores in shared memory 
    sem_init(&ptr->client_mutex,1,1); // set client semaphore to 1 
    sem_init(&ptr->server_mutex,1,0); // set server semaphore to 0 
    for(;;) 
     { 
     serverPosixShmSem(ptr); // calling server 
     } 
} 

/* Server main function for implementing client server program using Posix Shared Memory and Posix Unnamed Semaphores*/ 

#include "shm_sem.h" 
int main(int argc,char ** argv) 
{ 
    int fd; 
    struct shmstruct *ptr; 
    shm_unlink(MYSHM); // delete shared memory segment, if it already exists  
    /* create shared memory, set its size, map it and close descriptor */ 
    fd=shm_open(MYSHM,O_RDWR|O_CREAT|O_EXCL,0777); 
    ptr=mmap(NULL,sizeof(struct shmstruct),PROT_READ|PROT_WRITE,MAP_SHARED,fd,0); 
    // truncate the size of shared memory to the size of shmstruct 
    ftruncate(fd,sizeof(struct shmstruct)); 
    close(fd); 

    // initialize the semaphores in shared memory 
    sem_init(&ptr->client_mutex,1,1); // set client semaphore to 1 
    sem_init(&ptr->server_mutex,1,0); // set server semaphore to 0 
    for(;;) 
    { 
     serverPosixShmSem(ptr); // calling server 
    } 
} 

答えて

2

質問のカップル:

  • あなたは、共有メモリ/セマフォ(またはスーパーユーザーとして)を作成したのと同じユーザーとしてipcsを実行していますか?
  • プログラムの実行中にipcsを実行していますか? (それが終了したときに、それはそれらを削除していないあなたは確かにいますか?)

更新

実は、このthreadを読んだ後、私はIPCSがPOSIXセマフォを表示することができるようになっているかわかりません。コンパイルエラーを修正するためにサンプルコードを試しましたが、/dev/shmディレクトリに共有メモリセグメントがあります。

+0

私は共有メモリ/セマフォを作成したのと同じユーザとしてipcsを使用しています。サーバは共有メモリを作成し、共有メモリ内のセマフォを初期化する。バックグラウンドでサーバーを実行し、クライアントを実行する前にipcsと入力します。 – Anonymous

+0

クライアントが完了すると、共有メモリとセマフォが削除されます。 – Anonymous

5

ipcsは、System V IPCシステムに関する情報を表示します。 POSIXセマフォと共有メモリは、 'ipcs'によって監視されない独立した(そしてより良い)システムです。

+1

同じ仕事をするのにipcsの代わりに何を使うのかといった情報を追加することができれば、POSIXのsemsとshmemsのために、あらかじめ感謝の意を付けておくと本当に役に立ちます。 –

関連する問題