c编程shmat()权限被拒绝

时间:2015-05-12 19:27:21

标签: c memory permissions shared-memory denied

运行代码时遇到问题。我的shmat失败并打印权限被拒绝。我搜索谷歌如何解决它,但我不能。我的代码如下:

#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#define ERROR -1

int main ( int argc, char *argv[] ) {
    int shmid,key=50;
    int *val;
    int *x;
    int rw = -1;

    // 0 for write and 1 for read 

    shmid = shmget ( key, sizeof( int ), IPC_CREAT );

    if ( shmid == -1 ) {
        perror ( "Error in shmget\n" );
        return ( ERROR );
    }

    val = ( int * ) shmat ( shmid, NULL, 0 );

    if ( val == -1 ) {
        perror ( "Error in shmat\n" );
        return ( ERROR );
    }

    scanf ( "%d", &rw);

    while ( rw >= 0 ) {
        if ( rw == 0 ) {
            //write in the shared memory
            x = ( int * ) malloc ( sizeof ( int ) );

            if ( x == NULL ) {
                perror ( "Error in malloc" );
                return ( ERROR );
            }

            scanf ( "%d", x );

            val = x;

        }
        else {
            // read from the shared memory
            if ( rw == 1 ) {
                printf ( "%d\n", *val );
            }
        }

        scanf ( "%d", &rw );
    }

    return ( 0 );

}

在这段代码中,我想测试共享内存。当我给rw = 1时,我在共享内存中写了一个整数我读取了共享内存的值然后我打印了这个值。我无法找到问题所在......

3 个答案:

答案 0 :(得分:6)

您创建了权限设置为0000的共享内存段:

shmid = shmget ( key, sizeof( int ), IPC_CREAT );

应该是

shmid = shmget ( key, sizeof( int ), IPC_CREAT | 0660 );

或类似。

答案 1 :(得分:1)

除了shmget()调用的问题,如另一个答案

中所述

读取/写入一些整数

的代码存在很多问题 OP仍然获得“权限被拒绝”消息的事实是因为共享内存具有

1) not been detached -- see the man page for shmdt()
2) not been destroyed -- see the man page for shmctl()

解决这两个问题,共享内存操作可以很好地工作。

但是,正如评论中所提到的,发布的代码存在许多其他问题

答案 2 :(得分:0)

你在这里也有错误:

val = x;

应该是:

*val = *x;