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)
在您的情况下,问题可能是给定密钥没有关联的内存段.在这种情况下,您需要通过传入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)