Не могу определить размер объекта общей памяти - PullRequest
2 голосов
/ 21 октября 2019

Здравствуйте. Я пытаюсь создать объект общей памяти с помощью функций POSIX, но получаю странную ошибку.

// Создать общую память

if( (shmid = shm_open("/OS",   O_CREAT ,0700)) == -1){
    printf("Error creating memory\n");
    exit(1);
}
printf("shmid: %d\n", shmid);

if (ftruncate(shmid, sizeof(int)) == -1){
    printf("Error defining size\n");
    exit(1);
}

Как вы можете себе представитьон продолжает печатать «Ошибка определения размера». Значение, напечатанное shmid, равно 3, действительное значение. И все же функции ftruncate () возвращают -1 из-за ошибки ... значение, установленное в errno, равно 22, что, как я видел в Интернете, связано с "недопустимыми аргументами", но я не понимаю, почему .... предложения

1 Ответ

2 голосов
/ 21 октября 2019

Значение errno 22 в системе Linux равно EINVAL. Вместо того, чтобы показывать числовое значение, вы должны использовать perror или strerror(errno), чтобы получить текстовое сообщение об ошибке типа «Неверный аргумент».

Использовать

if ((shmid = shm_open("/OS", O_RDWR | O_CREAT, 0700)) == -1){

Документация POSIX для ftruncate() списки:

[EBADF] или [EINVAL] - Аргумент fildes не является дескриптором файла, открытым для записи.

и

[EINVAL] - Аргумент fildes ссылается на файл, который был открыт без разрешения на запись.

Страница руководства Linux по адресу https://linux.die.net/man/2/ftruncate сообщает

EBADF или EINVAL - fd не открыт для записи.

...