Основываясь примерно на ваши комментарии, вы хотите что-то вдоль линий этой функции:
/* return the fd or negative on error (check errno);
how is 1 if created, or 0 if opened */
int create_or_open (const char *path, int create_flags, int open_flags,
int *how) {
int fd;
create_flags |= (O_CREAT|O_EXCL);
open_flags &= ~(O_CREAT|O_EXCL);
for (;;) {
*how = 1;
fd = open(path, create_flags);
if (fd >= 0) break;
if (errno != EEXIST) break;
*how = 0;
fd = open(path, open_flags);
if (fd >= 0) break;
if (errno != ENOENT) break;
}
return fd;
}
Это решение не является пуленепробиваемые. Могут быть случаи (возможно, символические ссылки?), Которые заставили бы его зацикливаться навсегда. Кроме того, он может работать в режиме реального времени в определенных сценариях параллелизма. Я оставлю решение таких вопросов, как упражнение. :-)
В отредактированном вопрос, вы ставите:
У меня есть 10 процессов, которые пытаются открыть тот же файл более или менее в то же время, используя открытый (O_CREAT) вызов, а затем удалить Это.
Hack-ish, но более пуленепробиваемым решением было бы дать каждому процессу другой идентификатор пользователя. Затем просто используйте обычный вызов open(path, O_CREAT|...)
. Затем вы можете запросить файл с fstat()
в дескрипторе файла и проверить поле st_uid
структуры stat
. Если поле равно идентификатору пользователя процессов, то это был создатель. В противном случае это был нож. Это работает, так как каждый процесс удаляет файл после открытия.
Используйте '(O_CREAT | O_EXCL)', чтобы получить сообщение об ошибке, если файл уже существует. Когда вы получите сообщение об ошибке, вы проверяете 'errno', чтобы убедиться, что это так, потому что оно существует, а затем повторно открыть, но вы хотите его открыть, зная, что он уже существует. – jxh
А потом что делать? Но что, если другой процесс откроет его после моего чека, но до того, как я снова откроюсь, я хочу? – Sergey
Ваша проблема в вашем описании не уточняется полностью. Обновите свой вопрос с фактической проблемой, с которой вы сталкиваетесь. Покажите некоторый код и укажите, где что-то не происходит так, как вы ожидаете. – jxh