2

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

/* 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
    }  
}
4

2 に答える 2

2

いくつかの質問:

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

更新

実際、このスレッドを読んだ後、ipcs が POSIX セマフォを表示できるはずかどうかわかりません。サンプル コードを試してみました (コンパイル エラーを修正するための編集がいくつかあります)。ディレクトリに共有メモリ セグメントが表示されます/dev/shm

于 2009-05-18T22:39:51.547 に答える