Там какая-то ласка формулировка в руководстве по эксплуатации flock()
:
Блокировки, созданная flock()
связана с открытой записью таблицы файлов. Это означает, что дубликаты дескрипторов файлов (созданные, например, fork(2)
или dup(2)
) относятся к одной и той же блокировке, и эта блокировка может быть изменена или выпущена с использованием любого из этих дескрипторов.
Вы можете продемонстрировать это, более тщательно измерив программу, и разумно добавив еще одну вилку.Также неплохо убедиться, что файл создан правильно - при использовании O_CREAT
, open()
нужен третий аргумент для указания режима файла.
#include <fcntl.h>
#include <stdio.h>
#include <sys/file.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <time.h>
#include <unistd.h>
int main(void)
{
printf("%ld:%d: Before fork 1\n", (long)time(0), (int)getpid());
fork();
printf("%ld:%d: After fork 1\n", (long)time(0), (int)getpid());
int fd = open("lock.txt", O_WRONLY | O_CREAT, 0644);
int lock_ret;
fork();
printf("%ld:%d: After fork 2\n", (long)time(0), (int)getpid());
lock_ret = flock(fd, LOCK_EX);
printf("%ld:%d: lock returned %d\n", (long)time(0), (int)getpid(), lock_ret);
fflush(stdout);
sleep(4);
lock_ret = flock(fd, LOCK_UN);
printf("%ld:%d: unlock returned %d\n", (long)time(0), (int)getpid(), lock_ret);
fflush(stdout);
int corpse;
int status;
while ((corpse = wait(&status)) != -1)
printf("%ld:%d: PID %d died with status 0x%.4X\n", (long)time(0), (int)getpid(), corpse, status);
return 0;
}
Пример запуска:
1451543977:5731: Before fork 1
1451543977:5731: After fork 1
1451543977:5731: After fork 2
1451543977:5731: lock returned 0
1451543977:5732: After fork 1
1451543977:5733: After fork 2
1451543977:5733: lock returned 0
1451543977:5732: After fork 2
1451543977:5734: After fork 2
1451543981:5731: unlock returned 0
1451543981:5733: unlock returned 0
1451543981:5732: lock returned 0
1451543981:5731: PID 5733 died with status 0x0000
1451543985:5732: unlock returned 0
1451543985:5734: lock returned 0
1451543989:5734: unlock returned 0
1451543989:5732: PID 5734 died with status 0x0000
1451543989:5731: PID 5732 died with status 0x0000
Обратите внимание, как процессы, которые не разделяют один и тот же открытый файл описания блокированы; те, которые используют одно и то же открытое описание файла, не блокируются.
Также обратите внимание, что время штамповки и (особенно) «штамповка ПИД» выход помогает сделать вывод однозначным.
Возможно, это работает так, как я понимаю из вашего вывода на печать. Один из двух разветвленных процессов получает блокировку ... спит, разблокирует ... В то время как это происходит, второй процесс запуска запускает свою стаю, и он ждет, когда первый процесс разблокируется. Это то, что вы видите в printf(), process_1 запускается (process_2 запускается, но ждет), process_1 спит и заканчивается, затем process_2 запускается и заканчивается. –
Опишите, что случилось. Какая у вас ошибка ? –
@JorgeTorres нет, что вы говорите - это не то, что происходит. Второй процесс _is_not_ ждет. Это проблема. –