C shmat功能

时间:2014-12-18 20:59:09

标签: c posix shared-memory

我想创建一个在C中创建和附加共享内存的函数。当我在main中执行它时,它工作正常但是当我在函数中放入相同的代码时shmat返回NULL

int main() { 

    int data=0; 
    int* shm_data=NULL; 
    int shmid; 

    if ( ( shmid = shmget( SMKEY_data, sizeof(int), IPC_CREAT  | 0666 ) ) < 0) { 
        perror("Shmget Faild (shmid) "); 
        exit(3); 
    } 

    if ( (shm_data = shmat(shmid, 0, 0)) == (int *) - 1) { 
         perror("Shmat Faild (shm_data) "); 
         exit(4); 
    } 
    *shm_data = data; 

    printf("1: %d\n", *shm_data); 

    if ( fork() == 0 ) { 
        (*shm_data)++; 
    } 
    else { 
        int s; 
        wait(&s); 
        printf("2: %d\n", *shm_data); 
    } 
    return 0; 
} 

输出:

1:0
2:1

void doshm(int* shmid, int* shm_data, int* data) { 
    if ( ( (*shmid) = shmget( SMKEY_data, sizeof(int), IPC_CREAT  | 0666 ) ) < 0) { 
        perror("Shmget Faild (shmid) "); 
        exit(3); 
    } 

    if ( (shm_data = shmat( (*shmid), 0, 0)) == (int *) - 1) { 
         perror("Shmat Faild (shm_data) "); 
         exit(4); 
    } 
    *shm_data = *data; 
} 

int main() {
    int data=0; 
    int* shm_data=NULL; 
    int shmid; 

    doshm(&shmid, shm_data, &data); 

    printf("1: %d\n", *shm_data); 

    if ( fork() == 0 ) { 
        (*shm_data)++; 
    } 
    else { 
        int s; 
        wait(&s); 
        printf("2: %d\n", *shm_data); 
    } 
    return 0; 
} 

输出:

Segmentation fault (core dumped)

2 个答案:

答案 0 :(得分:1)

shm_data已初始化为NULL,且从未重新分配,通过引用传递给doshm

doshm(&shmid, &shm_data, &data);

然后将doshm的签名更改为

doshm(int* shmid, int** shm_data, int* data)

最后,从doshm

中删除此行
*shm_data = *data

另外,在shm_data == NULL之后doshm之后检查printf

答案 1 :(得分:0)

当你写

doshm(&shmid, shm_data, &data);

然后在shm_data

中更改doshm的值
if ( (shm_data = shmat(shmid, 0, 0)) == (int *) - 1) { ... }

然后此更改将对变量的本地副本进行操作,并且此更改不会应用于main范围内的版本,其中shm_data仍为NULL }。