Дублирование файлового дескриптора и поиск по ним обоим независимо - PullRequest
0 голосов
/ 16 февраля 2019

У меня есть дескриптор открытого файла, который я хочу продублировать, чтобы выполнить чтение и поиск по ним обоим независимо.Я посмотрел на системный вызов

int dup(int old_fd)

.Проблема в том, что она здесь не совсем подходит.Страница руководства сообщает следующее http://man7.org/linux/man-pages/man2/dup.2.html:

После успешного возврата старые и новые файловые дескрипторы могут использоваться взаимозаменяемо.Они ссылаются на одно и то же описание открытого файла (см. Open (2)) и, таким образом, совместно используют смещение файла и флаги состояния файла;например, если смещение файла изменяется с помощью lseek (2) для одного из файловых дескрипторов, смещение также изменяется для другого.

Есть ли способ дублировать дескриптор файла, чтобыони полностью независимы?

Ответы [ 2 ]

0 голосов
/ 16 февраля 2019

В Linux при открытии /proc/<pid>/fd/<n> открывается файл, который в данный момент открыт по адресу fd N , но это новая копия, а не связанная копия, как у вас с dup() и друзьями.

Это должно создать файл, содержащий bar, набор нулевых байтов, затем foo.Сравните с версией, используя dup().

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>

int main(void)
{
    int fd1, fd2;
    char buffer[50];

    fd1 = open("testfile", O_CREAT | O_TRUNC | O_RDWR, 0600);
    sprintf(buffer, "/proc/self/fd/%d", fd1);
#ifndef USE_DUP
    fd2 = open(buffer, O_RDWR);
    if (fd2 == -1) {
        perror("open");
    }
#else
    fd2 = dup(fd1);
#endif
    if (lseek(fd1, 16, SEEK_SET) == -1) {
        perror("lseek");
    }
    if (write(fd1, "foo", 3) == -1) {
        perror("write(fd1)");
    }
    if (write(fd2, "bar", 3) == -1) {
        perror("write(fd2)");
    }
}
0 голосов
/ 16 февраля 2019

Нет - по крайней мере, не в POSIX-определенных механизмах.

Если вы хотите полную независимость файловых дескрипторов, вам следует избегать общего открытого описания файла, что означает независимое open() или эквивалент.

Существует вероятность того, что есть механизм для Linux, который выполняет работу, о которой я не слышал.Однако просмотр системных вызовов для Linux на http://man7.org/linux/man-pages/man2/ не дал просветления.

...