![파일 작업 및 프로세스](https://linux55.com/image/128926/%ED%8C%8C%EC%9D%BC%20%EC%9E%91%EC%97%85%20%EB%B0%8F%20%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4.png)
서로 다른 두 프로세스(상위 및 하위)가 동일한 텍스트 파일을 보고 작업할 수 있습니까?
이 작업을 수행했지만 두 프로세스에서 파일을 열려면 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
'
$
표준 입력을 찾을 수 없으면 작동하지 않습니다. 또한 파이프(또는 어떤 형태의 통신)가 실제로 필요합니다. 그렇지 않으면 상위 프로세스가 하위 프로세스보다 먼저 실행될 수 있습니다.
파일 설명자가 공유되지 않으면 부모는 자식이 포인터를 이동한 위치부터 읽지 않습니다.