代码编译时没有警告或错误,但是如果我运行它,它会说 分段故障(核心已转储)。 我很确定这是一些基本问题,但我只是找不到。 如果有人看了就能找到问题,那就太好了。
我在Linux系统上使用以下命令对其进行编译: -gcc -Wall -pedantic -std = c99 prog.c -o programm
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/resource.h>
#include <sys/wait.h>
#include <signal.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/stat.h>
#include <sys/sem.h>
#define N_DATA 2000000
#define N_SHARED 2000
int main(int argc, char **argv){
int shmid;
int *array;
int i = 0;
key_t key = 12345;
shmid = shmget(key, 5, IPC_CREAT | 0666);
pid_t pid;
pid = fork();
if ( pid > 0 ) {
printf("Parent \n E-PID: %d K-PID: %d \n" , getpid(), pid);
array = (int*) shmat(shmid, NULL , 0);
for(i=0; i<5; i++)
{
array[i] = i;
}
printf("\nWritting to memory succesful--\n");
shmdt((void *) array);
}
if ( pid == 0) {
sleep(5);
printf("Son: \n E-PID: %d K-PID: %d \n" , getpid(), pid);
array = (int*) shmat(shmid, NULL , SHM_RDONLY);
for(i=0; i<5; i++)
{
printf("\n%d---\n", array[i] );
}
printf("\nRead to memory succesful--\n");
shmdt((void *) array);
}
}
答案 0 :(得分:0)
您需要包括shmget
,shmat
和shmdt
的头文件:
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
指针大小与32位上的int
大小相同,在C89时,这意味着该代码可以在大多数(即使不是全部)计算机上运行。在64位(指针的大小为long
或long long
)上不是这种情况,这会导致指针截断。这就是为什么您遇到段错误。
考虑到您在没有warning: implicit declaration of function 'xxx'
的情况下进行编译,因此您使用的强制转换会隐藏可能是-pedantic-errors
的编译器警告。
隐式函数声明在C99中被标记为已弃用,因此请尝试使用-pedantic-errors
进行编译,看看是否存在任何错误。
此外,不要忘记检查shm*
函数的返回值。