Какую ошибку я делаю, если даже root не может удалить файл блокировки, созданный с помощью O_CREAT |O_EXCEL? - PullRequest
2 голосов
/ 20 февраля 2012

Мы создали файл блокировки, чтобы избежать состояния гонки. Файл блокировки создается в каталоге /tmp, в котором установлен бит закрепления. Мы не передаем режим файла как опциональный третий аргумент при создании файла. И файл создается с использованием функции fopen и

int fd = fopen(filename, O_CREAT | O_EXCEL);

Мы удаляем этот файл блокировки по окончании его использования. Но иногда файл не удаляется и он остается в папке /tmp, блокируя другой процесс, и приложение остается активным, не продолжая работу. Файл блокировки удаляется отправкой команды в систему и используемая команда /usr/bin -rf. Что было удивительно, что ни владелец файла, ни пользователь root не смогли удалить файл после этого.

Выполнение операции ll lockfile в папке /tmp дало разрешение O / P в разрешении раздел "--- х ------", который я не смог расшифровать. Изменение разрешения файл блокировки с chmod 777 filename по root идентификатор пользователя не работает. И система должна быть перезагружена, чтобы удалить файл блокировки из директории /tmp.

Ответы [ 2 ]

4 голосов
/ 20 февраля 2012

Вы говорите, что создаете файл следующим образом:

int fd = fopen(filename, O_CREAT | O_EXCEL);

Это не соответствует сигнатуре fopen:

FILE *fopen(const char *filename, const char *mode);

Так что я предполагаю, что вы действительно используете open:

int fd = open(filename, O_CREAT | O_EXCL);

Это ошибка, потому что третий аргумент open (2) - это "mode", и он обязателен, когда используется O_CREAT.

Поскольку вы не передаете аргумент mode, вы вызываете неопределенное поведение, и режим, вероятно, получает какое-то нежелательное значение.Попробуйте передать 0666 в качестве третьего аргумента open (2) и посмотрите, поможет ли это.

1 голос
/ 21 февраля 2012

Тем временем, чтобы решить проблему и удалить файл - от имени root запустите:

chmod 755 /tmp/lockfile
rm /tmp/lockfile
...