这是我等待共享内存的两个文件,一个是写数据共享内存,另一个是从共享内存和printf数据中读取数据;但是有一些错误。
嘘嘘

#include  <stdio.h>

#include  <sys/shm.h>

#include  <string.h>

#define  MAX_MEM 4096




int main()
{

    int shmid;
    int ret;
    void* mem;

    shmid=shmget(0x12367,MAX_MEM,IPC_CREAT | 0666 );
    printf("shmid is = %d,pid=%d\n",shmid,getpid());
    mem=shmat(shmid,(const void*)0,0);
    if((int)mem==-1)
    {
            printf("attach faile.\n");
    }

    strcpy((char*)mem,"Hello,this is test memory.\n");

    ret=shmdt(mem);

return 0;

}

嘘嘘
#include <errno.h>

#include <stdio.h>

#include <sys/shm.h>

#include <string.h>

#define MAX_MEM 4096



int main()

{

        int shmid;
        int ret;
        void* mem;

        shmid=shmget(0x12367,MAX_MEM,0);
        mem=shmat(shmid,(const void*)0,0);
        //printf("%s\n",(char*)mem);
        if(mem==(void*)-1)
        {
            fprintf(stderr,"shmat return NULL ,errno(%d:%s)\n",errno,strerror(errno));
            return 2;
        }
        printf("%s\n",(char*)mem);

        shmdt(mem);

return 0;



}

当我在CentOS6.8中编译两个.c文件时,第一次就可以了。
不幸的是,从现在起,我发现她说得对:
shmid=65537,pid=7116。
但当我运行shm_r.c时,出现错误:
shmat返回NULL,errno(22:无效参数)
所以我不知道发生了什么?我试图解决它,例如使用ipcs-m,但没有出现shmid。
和I cat/proc/7116/maps:
“没有这样的文件或目录”
谁能告诉我发生了什么事?我怎么能在CentOS6.6找到shmid
uname -r:
2.6.32-504.12.2.el6.x86_64

我也使用cat/proc/sysvipc/shm | grep 65537,但没有显示shmid。
祝你好运!
如果你知道,请告诉我怎么解决这个问题,谢谢!

最佳答案

我已下载并运行您的程序,无法复制您的[冲突的]结果。
要列出活动的shm段,请使用ipcs命令。如果需要删除创建的,可以使用ipcrm命令。
有两件事我能想到,这可能是一个问题,但我打折他们,因为你说,你成功运行的第一次。
对段的权限,因为您第一次错误地创建了它。ipcs应该显示这个。
在调试writer程序时,它可能做了一些不正确的事情。这可以通过ipcs看到。如果出现错误,可以使用ipcrm手动删除段,然后重试程序。
另一种可能是键与另一个程序创建的其他段冲突。这不太可能有两个原因。
你的钥匙可能是独一无二的。这也可以用ipcs检查
现在大多数程序使用的键是0x00000000,这是“私有”模式。这是在程序执行fork但不执行execvp时完成的。孩子只是调用一些函数(例如child_worker)。父母和孩子使用“私有”段来回传递数据。因为段是私有的,所以不必担心有一个唯一的键值。
因为您有两个独立的程序,使用该模式对您的用例不起作用。您需要一个非零的键值,这样您的段将从一个程序调用持续到下一个程序调用。
为了简单起见,我将两个程序合并为一个程序。我还添加了一个删除shm段的选项。
注:我只做了整容。我没有修理任何虫子。所以,这只是我在系统上测试的一个参考:

#include <stdio.h>
#include <sys/shm.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>

#define MAX_MEM 4096
#define XID     0x12367

int opt_cmd;

void
writer(void)
{
    int shmid;
    void *mem;

    shmid = shmget(XID,MAX_MEM,IPC_CREAT | 0666);
    printf("shmid is = %d,pid=%d\n",shmid,getpid());
    mem = shmat(shmid,NULL,0);
    if (mem == (void *) -1) {
        printf("attach faile.\n");
    }

    strcpy((char *) mem,"Hello,this is test memory.\n");

    shmdt(mem);
}

void
reader(void)
{
    int shmid;
    void *mem;

    shmid = shmget(XID,MAX_MEM,0);
    mem = shmat(shmid,NULL,0);

    // printf("%s\n",(char*)mem);
    if (mem == (void *) -1) {
        fprintf(stderr,"shmat return NULL ,errno(%d:%s)\n",
            errno,strerror(errno));
        exit(2);
    }

    printf("%s\n",(char *) mem);

    shmdt(mem);
}

void
clean(void)
{
    int shmid;

    shmid = shmget(XID,MAX_MEM,0);
    shmctl(shmid,IPC_RMID,NULL);
}

// main -- main program
int
main(int argc,char **argv)
{
    char *cp;

    --argc;
    ++argv;

    for (; argc > 0; --argc, ++argv) {
        cp = *argv;
        if (*cp != '-')
            break;

        switch (cp[1]) {
        case 'd':
        case 'w':
        case 'r':
            opt_cmd = cp[1];
            break;

        default:
            break;
        }
    }

    switch (opt_cmd) {
    case 'w':
        writer();
        break;

    case 'd':
        clean();
        break;

    default:
        reader();
        break;
    }

    return 0;
}

10-06 06:02