我最近在我们的服务器上更新OSX软件后发现我无法运行我的程序而没有获得Segmentation Fault 11.这是一个简单的程序,它试图分配共享内存然后释放它。当我使用sudo编译和运行我的文件时,它工作正常。任何帮助将不胜感激!
源代码:
#include <stdlib.h>
#include <stdio.h>
#include <sys/shm.h>
#include <sys/ipc.h>
#include <sys/types.h>
#include <stddef.h>
#include <sys/un.h>
#include <unistd.h>
int main(){
double *shared;
int arrsize, shmid;
arrsize = 10;
shmid = shmget(IPC_PRIVATE, arrsize * sizeof(double), IPC_CREAT | 666);
shared = (double*) shmat(shmid, NULL, 0);
shared[2] = 3.0; //source of Segmentation Fault
shmdt( (void*) shared );
shmctl(shmid, IPC_RMID, NULL);
printf("Success!");
return 0;
}
系统:
ProductName: Mac OS X
ProductVersion: 10.9.1
BuildVersion: 13B42
答案 0 :(得分:2)
您没有正确设置共享内存的权限。您必须使用sys/stat.h
中的宏来传递正确的权限。咨询man 2 chmod
:
shmid = shmget(IPC_PRIVATE, arrsize * sizeof(double), S_IRUSR | S_IWUSR );
会做的伎俩。
答案 1 :(得分:1)
作为普通用户运行时,shmget
调用可能会失败,因为您的文字值666
正在被解析为十进制文字。您需要一个前导0
才能将其识别为八进制。