Найдите максимальное количество семафоров, которые может открыть один процесс за раз - PullRequest
0 голосов
/ 30 апреля 2018

Чтобы найти максимальное количество семафоров, которые может открыть один процесс за один раз, я не понял, почему приведенный ниже код _SC_SEM_NSEMS_MAX возвращает -1.

int main(void) {
        long max_limit = 0;
        errno = EINVAL;
        max_limit = sysconf(_SC_SEM_NSEMS_MAX);
        printf("max_limit : %ld error_no : %d\n",max_limit,errno);

        return 0;
} 

Редактировать: - Вот то, что я пытался получить максимальный предел вручную.

struct count {
        sem_t sem_addr;
        int count;
};
int main(void) {
        int fd = 0,zero = 0;
        struct count *shared;
        fd = shm_open("/my_semaphore",O_RDWR|O_CREAT,0777);
        if(fd == -1){
                perror("shm_open");
                exit(0);
        }
        //ftruncate(fd,4096);
        write(fd,&zero,4);
        shared = mmap(NULL,4096,PROT_READ|PROT_WRITE,MAP_SHARED,fd,(off_t)0);
        sem_init(&shared->sem_addr,1,1);

        pid_t pid = fork();
        if(pid > 0) {
                //printf("parent process: %d \n",getpid());
                sem_wait(&shared->sem_addr);
                for(int i = 0;i < 50 ;i++) {
                        printf("parent = %d \n",shared->count++);
                }
                sem_post(&shared->sem_addr);
        }
        else if (pid == 0) {
                //printf("child process: %d \n",getpid());
                sem_wait(&shared->sem_addr);
                for(int i = 0;i < 50 ;i++) {
                        printf("child = %d \n",shared->count++);
                }
                sem_post(&shared->sem_addr);
        }
        sem_destroy(&shared->sem_addr);
        return 0;
}

Любая помощь будет оценена.

Ответы [ 3 ]

0 голосов
/ 30 апреля 2018

со страницы руководства:

RETURN VALUE
       If name is invalid, -1 is returned, and errno is set to EINVAL.  Other‐
       wise, the value returned is the value of the system resource and errno
       is  not  changed.  In the case of options, a positive value is returned
       if a queried option is available, and -1 if it is not.  In the case  of
       limits, -1 means that there is no definite limit.

Обратите внимание, в частности, на последнее предложение. Таким образом, -1 может означать, что ваша система не знает о _SC_SEM_NSEMS_MAX или что ограничений нет. В любом случае, я понимаю, что это означает, что максимальное количество открытых семафоров не ограничено системой произвольно (конечно, оно может быть ограничено ограничениями памяти и т. Д.).

0 голосов
/ 30 апреля 2018
long sysconf(int name );

Возвращает значение лимита, указанного именем, или –1, если предел не определен или произошла ошибка.

Если предел не может быть определен, sysconf () возвращает -1. Может также вернуть -1, если произошла ошибка. (Единственной указанной ошибкой является EINVAL, указывающая, что имя недействительно.) Чтобы отличить случай неопределенного предела от ошибки, мы должны установить errno равным нулю перед вызовом; если вызов возвращает -1 и errno устанавливается после вызова, то произошла ошибка, в противном случае предел не определен.

В вашем случае это не ошибка, но предел не может быть определен.

#include <stdio.h>
#include <errno.h>
#include <limits.h>
#include <unistd.h>
extern errno ;
int main()
{
    errno = 0;
    long max_limit = 0;
    max_limit = sysconf(_SC_SEM_NSEMS_MAX);
    printf("%ld\n", max_limit);
    printf("err msg: %m\n");
    return 0;
}  

Выход:
-1
сообщение об ошибке: успех

0 голосов
/ 30 апреля 2018

Может быть, вы должны проверить errno?

   The return value of sysconf() is one of the following:

   *  On error, -1 is returned and errno is set to indicate the cause of
      the error (for example, EINVAL, indicating that name is invalid).

   *  If name corresponds to a maximum or minimum limit, and that limit
      is indeterminate, -1 is returned and errno is not changed.  (To
      distinguish an indeterminate limit from an error, set errno to
      zero before the call, and then check whether errno is nonzero when
      -1 is returned.)

   *  If name corresponds to an option, a positive value is returned if
      the option is supported, and -1 is returned if the option is not
      supported.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...