связанный семафор - smtctl использовать IPC_RMID не удалось с недопустимым аргументом - PullRequest
0 голосов
/ 10 августа 2010

Если я не определяю макрос LINUX_ENV, все идет хорошо (особенно, команда IPC_RMID возвращает 0).но если я определю LINUX_ENV (я работаю на linux system-ubuntu10.04), то команда cmd последнего semctl возвращает EINVAL и говорит: Недопустимый аргумент , т.е. семафор не удаляется.кажется, ранее semctl SEM_INFO cmd вызывает позже IPC_RMID cmd return Недопустимый аргумент в системе linux Где в моем коде что-то не так? Может кто-нибудь помочь мне с этим. Заранее спасибо.

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

//#define LINUX_ENV

#ifdef LINUX_ENV
#define _GNU_SOURCE
#endif

union semun{
    int val;
    struct semid_ds *buf;
    unsigned short int *array;
    struct seminfo *__buf;
};

int main(int argc,char* argv[])
{
    key_t key;
    int semid;
    int nsems;
    int proj_id;

    struct semid_ds semid_ds_buf;
    union semun semun_buf;
    struct seminfo* sem_info;

    proj_id=rand();
    key=ftok(argv[0],proj_id);
    nsems=2;
    semid=semget(key,nsems,IPC_CREAT|IPC_EXCL|0666);
    if(semid==-1)
    {
        perror("semget failed");
        return -1;

    }else
    {
        printf("key(%s,%d) semaphore id:%d\n",argv[0],proj_id,semid);
    }
    semun_buf.buf=&semid_ds_buf;
    //nsems is ignored
    semctl(semid,0,IPC_STAT,&semid_ds_buf);

    printf("current number of semaphores:%lu\n",semid_ds_buf.sem_nsems);

#ifdef LINUX_ENV
    if(semctl(semid,0,SEM_INFO,&semun_buf)==-1)
    {
        printf("semctl SEM_INFO failed");
        return -2;
    }

    sem_info=(struct seminfo*)(&semid_ds_buf);
    printf("max entries in semaphore map:%d\n",sem_info->semmap);

#endif
    if(semctl(semid,0,IPC_RMID,0)==-1)
    {
        perror("semctl IPC-RMID failed");
        return -3;
    }
    return 0;
}

1 Ответ

1 голос
/ 10 августа 2010

вызов SEM_INFO возвращает структуру seminfo , определенную следующим образом:

struct  seminfo {
    int semmap;  /* # of entries in semaphore map;
                 unused */
    int semmni;  /* Max. # of semaphore sets */
    int semmns;  /* Max. # of semaphores in all
                 semaphore sets */
    int semmnu;  /* System-wide max. # of undo
                 structures; unused */
    int semmsl;  /* Max. # of semaphores in a set */
    int semopm;  /* Max. # of operations for semop() */
    int semume;  /* Max. # of undo entries per
                 process; unused */
    int semusz;  /* size of struct sem_undo */
    int semvmx;  /* Maximum semaphore value */
    int semaem;  /* Max. value that can be recorded for
                 semaphore adjustment (SEM_UNDO) */
};

установите буфер возврата на вышеуказанную структуру и попробуйте снова. Надеюсь, поможет. (Я не могу воссоздать вашу проблему, используя приведенный выше код в системе RHEL5.4.)


...