파일 작업 및 프로세스

파일 작업 및 프로세스

서로 다른 두 프로세스(상위 및 하위)가 동일한 텍스트 파일을 보고 작업할 수 있습니까?

이 작업을 수행했지만 두 프로세스에서 파일을 열려면 fopen()을 사용해야 합니다. 내 기대는 프로세스 중 하나가 파일을 열고 다른 프로세스가 이를 보고 조작할 수 있다는 것입니다.

답변1

~에서fork(2)수동내 OpenBSD 시스템에서(강조):

하위 프로세스에는 상위 프로세스 설명자의 자체 복사본이 있습니다. 이러한 설명자는 동일한 기본 개체를 참조하므로 예를 들어 다음과 같습니다.파일 객체의 파일 포인터는 자식과 부모 간에 공유됩니다.lseek(2), 하위 프로세스의 설명자가 후속 read(2) 또는 write(2)상위 프로세스 설명자에 영향을 미칠 수 있도록 합니다. 또한 셸은 이 설명자 복사본을 사용하여 표준 입력 및 출력을 설정하고 새로 생성된 프로세스에 대한 파이프를 설정합니다.

이는 하위 프로세스를 포크하기 전에 상위 프로세스에서 파일을 열면 두 프로세스 모두 동일한 파일을 열게 됨을 의미합니다. 그러나 자식 프로세스가 파일을 읽으면 부모 프로세스의 파일 포인터도 이동됩니다.

두 프로세스에서 파일에 액세스독립적으로, 두 프로세스에서 파일을 열어야 합니다.

상위에서 파일을 열면뒤쪽에호출 fork()하면 하위 프로세스에서 열리지 않으며 그 반대의 경우도 마찬가지입니다.

답변2

다음은 이를 수행하는 몇 가지 샘플 코드입니다.

#include <err.h>
#include <stdio.h>
#include <unistd.h>

char buf[8];

int main(int argc, char *argv[])
{
    int ch, fd[2], rv;

    pipe(fd);

    switch (fork()) {
    case -1:
        err(1, "could not fork");
    case 0:                    // child
        rv = lseek(STDIN_FILENO, -7, SEEK_END);
        if (rv == -1) err(1, "could not seek");
        sleep(3);
        close(fd[1]);
        break;
    default:                   // parent
        close(fd[1]);
        read(fd[0], &ch, 1);
        read(STDIN_FILENO, buf, 7);
        printf("read '%s'\n", buf);
    }
    return 0;
}

부모 프로세스는 자식 프로세스를 기다리는 것을 차단하고 자식 프로세스는 표준 입력에서 7을 뺀 값을 찾은 다음 pipe(2)부모 프로세스를 종료합니다. 이렇게 하면 하위 프로세스가 공유 파일 포인터를 이동한 위치에 있는 공유 설명자에서 데이터를 읽는 상위 프로세스의 차단이 해제됩니다.

$ make sharedseek
cc     sharedseek.c   -o sharedseek
$ echo asdfasdfasdf123456 > x
$ ./sharedseek < x
read '123456
'
$ 

표준 입력을 찾을 수 없으면 작동하지 않습니다. 또한 파이프(또는 어떤 형태의 통신)가 실제로 필요합니다. 그렇지 않으면 상위 프로세스가 하위 프로세스보다 먼저 실행될 수 있습니다.

파일 설명자가 공유되지 않으면 부모는 자식이 포인터를 이동한 위치부터 읽지 않습니다.

관련 정보