c Запрещено программирование shmat ()

У меня проблема, когда я запускаю свой код. Мой shmat терпит неудачу и отказывает в печати. Я искал в Google, как решить, но я не могу. Мой код следующий:

#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 ответа

Вы создали сегмент общей памяти с разрешениями, установленными на 0000:

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

должно быть

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

или похожие.

У вас также есть ошибка здесь:

val = x;

должно быть:

*val = *x;

Кроме проблемы с вызовом shmget(), как описано в другом ответе

И многочисленные проблемы с кодом, который читает / записывает некоторые целые числа

тот факт, что OP по-прежнему получает сообщение "Отказано в доступе", заключается в том, что

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

Исправьте эти две проблемы, и операции с общей памятью будут работать хорошо.

Однако, как упоминалось в комментариях, есть много других проблем с размещенным кодом

Другие вопросы по тегам