Использование семафоров не работает при открытии файла в папке tmp - PullRequest
0 голосов
/ 03 октября 2018

Итак, я пытаюсь работать с параллелизмом с несколькими процессами (fork).

Сначала я запустил код в своей локальной папке, и код работает нормально.Однако, когда я попытался установить файл в папку tmp в UNIX, мой код не блокируется семафором.Мне кажется, что при открытии файла из папки tmp каждый процесс выполняет всю работу вместо разделения работы, или в некоторых редких случаях один процесс выполняет всю работу, а два других процесса так или иначе никогда не получают доступ к блокировке.

Сводит меня с ума, если он работает для локального файла, то нет никаких причин, по которым он не работает в папке tmp.

Основная цель - у меня есть набор дочерних процессов из fork(), только 1 процесс получает контроль над CS, которая является открытым файлом, считыванием значения из файла, сохранением значения, закрытием файла, изменением значения, открытием файла, записью файла значений, закрытием файла и тем самым завершением CS.Я использую POSIX semaphore.

Есть ли причина, по которой у tmp / file.txt могут возникнуть проблемы с sem_wait()/sem_post().Любой указатель был бы полезен.

Единственное различие между двумя кодами:

fd = open("Seq.txt", O_RDONLY);

против

fd = open("tmp/Seq.txt", O_RDONLY);

Нужно ли публиковать фрагмент кода большего размера?

1 Ответ

0 голосов
/ 03 октября 2018

Было бы полезно узнать, как разрешаются пути, чтобы вы могли избежать подобных ошибок в будущем.

Из онлайн-справки Разрешение пути :

Соответствующие выдержки:

Если путь начинается с символа '/',Начальный каталог поиска является корневым каталогом вызывающего процесса.(Процесс наследует свой корневой каталог от своего родителя. Обычно это будет корневой каталог файловой иерархии.

Если путь не начинается с символа '/', начальный каталог поискапроцесс разрешения - это текущий рабочий каталог процесса.

Имена путей, начинающиеся с символа '/', называются абсолютными путями. Имена путей, не начинающиеся с '/', называются относительными путями.

Вы можете просмотреть всю страницу, и это будет весьма полезно.

Если вы хотите избежать использования абсолютного имени пути из-за его длины,
вы также можете рассмотреть возможность использования openat() вместо open().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...