В разделе 8.3 fork function
APUE о совместном использовании файлов между родительским и дочерним процессами
сказано: It is important that the parent and the child share the same file offset.
А в разделе 8.9 Race Conditions
есть пример: и родитель, и дочерний элемент пишут
в файл, который открывается перед вызовом функции fork. Программа содержит состояние гонки,
потому что вывод зависит от порядка, в котором процессы выполняются ядром, и от того, как долго выполняется каждый процесс.
Но в моем тестовом коде выходные данные перекрываются.
[Langzi@Freedom apue]$ cat race.out
это длинный длинный выводэто длинный длинный вывод от родителя
Кажется, что родительский и дочерний файлы имеют отдельные смещения файлов вместо того, чтобы использовать одно и то же смещение.
Есть ли ошибка в моем коде? Или я неправильно понял смысл совместного использования смещения?
Будем признательны за любые советы и помощь.
следующий мой код:
#include "apue.h"
#include <fcntl.h>
void charatatime(int fd, char *);
int main()
{
pid_t pid;
int fd;
if ((fd = open("race.out", (O_WRONLY | O_CREAT | O_TRUNC),
S_IRUSR | S_IWUSR)) < 0)
err_sys("open error");
if ((pid = fork()) < 0)
err_sys("fork error");
else if (pid == 0)
charatatime(fd, "this is a long long output from child\n");
else
charatatime(fd, "this is a long long output from parent\n");
exit(0);
}
void charatatime(int fd, char *str)
{
// try to make the two processes switch as often as possible
// to demonstrate the race condition.
// set synchronous flag for fd
set_fl(fd, O_SYNC);
while (*str) {
write(fd, str++, 1);
// make sure the data is write to disk
fdatasync(fd);
}
}