[d-kernel] shmctl: Invalid argument
Sergey Vlasov
vsu at altlinux.ru
Tue Dec 9 17:55:49 MSK 2003
On Tue, Dec 09, 2003 at 05:29:32PM +0300, Grigory Batalov wrote:
> После переезда с ядра 2.4.20-alt10-smp на 2.4.22-std-smp-alt12
> от программы amdump (пакет amanda) наблюдаются сообщения:
>
> taper: FATAL shmctl: Invalid argument
>
> Я просмотрел исходники taper, его манипуляции с памятью
> можно упростить до прилагаемого файла.
> Указанное сообщение соответствует коду в taper.c:
>
> if(shmid == -1) return; /* nothing to destroy */
> if(shmctl(shmid, IPC_RMID, NULL) == -1) {
> error("shmctl: %s", strerror(errno));
> }
>
> При запуске shmtest обычным пользователем видно, что память
> выделяется и затем (через заданные 5 сек.) освобождается:
>
> $ ipcs
> ------ Shared Memory Segments --------
> key shmid owner perms bytes nattch status
> 0x00000000 262150 bga 700 1048576 1
> <skip>
>
> Однако, на ядре 2.4.20-alt10-smp программа завершается
> молча, а на 2.4.22-std-smp-alt12 выходит сообщение:
>
> ./shmtest: : Unknown error 2339276
Не воспроизводится...
И программа с ошибками - попробуйте приложенный исправленный вариант.
gcc -o shmtest -g -O2 -Wall -W shmtest.c
-------------- next part --------------
#define _GNU_SOURCE
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <errno.h>
#include <stdio.h>
#include <unistd.h>
#include <error.h>
#include <stdlib.h>
int main(void)
{
int shmid = -1;
char *result;
shmid = shmget(IPC_PRIVATE, 1024*1024, IPC_CREAT|0700);
if(shmid == -1) {
error(0, errno, "shmget");
exit(1);
}
result = (char *)shmat(shmid, NULL, 0);
if(result == (char *)-1) {
int save_errno = errno;
if(shmctl(shmid, IPC_RMID, NULL) == -1) {
error(0, errno, "shmctl");
}
error(0, save_errno, "shmat");
exit(1);
}
sleep(5);
if(shmctl(shmid, IPC_RMID, NULL) == -1) {
error(0, errno, "shmctl");
exit(1);
}
if(shmdt(result) == -1) {
error(0, errno, "shmdt");
exit(1);
}
exit(0);
}
More information about the devel-kernel
mailing list