У меня есть несколько процессов, порожденных через форк из основной программы, что означает, что они выводят на один и тот же стандартный вывод (который я хочу). Однако мне нужно как-то предотвратить чередование вывода. Я уже использую блокировки fcntl для синхронизации доступа к файлу журнала, поэтому я хотел использовать его также для stdout.
Однако в этом сообщении в блоге утверждается, что блокировки fcntl равны associated with an [i-node, pid] pair
. У stdout есть инод? Я решил просто попробовать
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/wait.h>
void do_log(const char *msg) {
printf("%5ld: %s\n", getpid(), msg);
}
void try_lock(void) {
do_log("Trying to lock stdout...");
struct flock fl = {
.l_type = F_WRLCK,
.l_whence = SEEK_SET,
.l_start = 0,
.l_len = 0,
};
if (fcntl(STDOUT_FILENO, F_SETLKW, &fl) == -1) {
perror("fcntl - lock");
exit(1);
}
do_log("Stdout locked");
sleep(2);
do_log("Trying to unlock stdout...");
fl.l_type = F_UNLCK;
if (fcntl(STDOUT_FILENO, F_SETLKW, &fl) == -1) {
perror("fcntl - unlock");
exit(1);
}
do_log("Stdout unlocked");
}
int main(void) {
if (fork()) {
try_lock();
} else {
try_lock();
}
wait(NULL);
return 0;
}
, который, кажется, работает
17156: Trying to lock stdout...
17155: Trying to lock stdout...
17155: Stdout locked
17155: Trying to unlock stdout...
17155: Stdout unlocked
17156: Stdout locked
17156: Trying to unlock stdout...
17156: Stdout unlocked
но в man-странице для fcntl я заметил If fildes refers to a typed memory object, the result of the fcntl() function is unspecified.
, и я понятия не имею, что это значит.
Итак, я думаю, у меня есть два вопроса:
- Гарантируется ли использование блокировки fcntl на stdout, как это?
- Если ответ на вопрос 1. Да, является ли сообщение в блоге неправильным о
[i-node, pid]
или в stdout действительно есть i-узел?