无法运行共享内存程序

时间:2014-07-07 08:48:44

标签: c linux shared-memory

我已将以下程序编写为共享内存示例。我想从write.c文件中创建的共享内存中写一些消息,并希望在同一内存中的read.c进程中显示它。但是当我尝试运行程序时,我收到错误消息:

Segmentation fault (core dumped)

已尝试但无法在我的代码中找到错误。

write.c文件:

#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>

main() {
    key_t key=1235;
    int shm_id;
    void *shm;
    char *message = "hello";
    shm_id = shmget(key,10*sizeof(char),IPC_CREAT);
    shm = shmat(shm_id,NULL,NULL);
    sprintf(shm,"%s",message);
}

read.c文件:

#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>

main() {
    key_t key=1235;
    int shm_id;
    void *shm;
    char *message;
    message = malloc(10*sizeof(char));
    shm_id = shmget(key,10*sizeof(char),NULL);
    shm = shmat(shm_id,NULL,NULL);
    if(shm == NULL)
    {
        printf("error");
    }
    sscanf(shm,"%s",message);
    printf("\n message = %s\n",message);
}

2 个答案:

答案 0 :(得分:1)

这不是sprintf的问题。这是一个权限问题,您无权附加刚刚创建的细分受众群。当我运行你的&#34;写&#34;程序作为普通用户,shmat失败并返回-1,然后sprintf当然崩溃。 shmat还将errno设置为13(&#34; Permission denied&#34;)。当我以root身份运行时,它可以工作。

尝试使用此功能(并使用新密钥):

shm_id = shmget(key, 10*sizeof(char), IPC_CREAT | 0777);

标志0777是该段的权限,类似于文件的权限。

答案 1 :(得分:0)

By tracking the error using printf statement ,

main() {

 key_t key=1235;
 int shm_id;
 void *shm;
 char *message = "hello";
 shm_id = shmget(key,10*sizeof(char),IPC_CREAT);
 printf("hello 1\n");
 shm = shmat(shm_id,NULL,NULL);
 printf("hello 2\n");
 sprintf(shm,"%s",message);
 printf("hello 3\n");

}

I explored that it is giving segmentation fault after executing sprint, so look for the arguments that you passed to function .
Similar is the case for sscanf in read.c