Использование sem_wait в программе - PullRequest
1 голос
/ 26 мая 2019

Я написал эту простую программу, которая создает дочерний процесс и печатает некоторые сообщения внутри:

#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/wait.h>
sem_t *init;


int main()
{
init=sem_open("/mysem", O_CREAT, 0644, 1);
pid_t c,c2;
c=fork();
if(c==0){
sem_wait(init);
for(int i=0;i<5;i++){
printf("critical1 \n");
}
}}

Я прочитал, что sem_wait проверяет значение семафора и, если оно больше 0, уменьшает его и продолжает, и если оно равно 0, оно застревает там до тех пор, пока это значение не будет увеличено. Поэтому после инициализации значения семафора равным 1, я ожидаю, что sem_wait продолжить в обычном режиме и не блокировать программу. Однако в этом случае эта программа ничего не печатает и завершает работу (а не просто делает паузу). Что мне не хватает?

1 Ответ

3 голосов
/ 26 мая 2019

Проблема здесь в том, что семафоры posix сохраняются при запуске программы.При первом запуске все работает.При последующих запусках значение инициализации игнорируется, так как семафор уже существует и поэтому поддерживает нулевое значение.Попробуйте эту модификацию, которая отменяет связь семафора, когда программа заканчивается.Обратите внимание, что он может не сработать при первом запуске, поскольку семафор может существовать на вашем компьютере.Это будет работать при последующих казнях:

#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/wait.h>
sem_t *init;


int main()
{
  init=sem_open("/mysem", O_CREAT, 0644, 1);
  pid_t c,c2;
  c=fork();

  if(c==0)
  {
    printf("before sem_wait()\n");
    sem_wait(init);
    printf("after sem_wait()\n");

    for(int i=0;i<5;i++)
    {
      printf("critical1 \n");
    }
    sem_close(init);
  }
  else
  {
    sleep(5);
    printf("main() exiting.\n");
    sem_close(init);
    sem_unlink("/mysem");
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...