使用C了解共享内存

ada*_*ges 3 c linux memory ftok

使用C,我正在尝试设置共享内存.我的代码看起来像:

key_t key = ftok("SomeString", 1);
static int *sharedval;
int shmid = shmget(key, sizeof(int), S_IRUSR | S_IWUSR); // less permissions
sharedval = (int *) shmat(shmid, NULL, 0);
*sharedval = 0;
Run Code Online (Sandbox Code Playgroud)

然而,第二个我运行最后一行,我得到一个分段错误.调试时,我可以打印"sharedval",我得到一个内存地址,大概就是我得到的内存中的位置.所以我认为我所要做的就是*sharedval用来评估它,但显然不是.我怎么想从共享内存中读取?向正确的方向推进将是美妙的.谢谢!

编辑:

another.anon.coward的输出:

$ ./a.out 
ftok: No such file or directory
shmget: No such file or directory
Trying shmget with IPC_CREAT
shmget success
shmat success
Segmentation fault: 11
Run Code Online (Sandbox Code Playgroud)

ano*_*ard 5

在您的情况下,问题可能是给定密钥没有关联的内存段.在这种情况下,您需要通过传入IPC_CREATflag 来创建内存段shmget.请用于perror检查您的错误消息.使用可以尝试以下代码

    #include <stdio.h> //For perror
    ...

    key_t key = ftok("SomeString", 1);
    if ( 0 > key )
    {
       perror("ftok"); /*Displays the error message*/
       /*Error handling. Return with some error code*/
    }
    else /* This is not needed, just for success message*/
    {
       printf("ftok success\n");
    }

    static int *sharedval;
    int shmid = shmget(key, sizeof(int), S_IRUSR | S_IWUSR | IPC_CREAT);
    if ( 0 > shmid )
    {
        perror("shmget"); /*Displays the error message*/
    }
    else /* This is not needed, just for success message*/
    {
       printf("shmget success\n");
    }

    sharedval = (int *) shmat(shmid, NULL, 0);
    if ( 0 > sharedval )
    {
       perror("shmat"); /*Displays the error message*/
       /*Error handling. Return with some error code*/
    }
    else /* This is not needed, just for success message*/
    {
       printf("shmat success\n");
    }
    *sharedval = 0;
    ...
Run Code Online (Sandbox Code Playgroud)