하나의 파일을 여러 쓰레드에서 읽을 수 있을까요?
글쓴이: mg2000 / 작성시간: 금, 2008/10/24 - 6:24오후
안녕하세요.
제가 멀티스레드로 돌아가는 프로그램을 만들다가...
fopen/fread 함수를 이용해서 파일을 열면, 가장 먼저 이 파일을 연 쓰레드는 아무 문제 없이 파일을
읽을텐데, 다른 쓰레드들은 이 쓰레드가 연 파일을 읽을 수 없을 것 같은데요.
fopen으로 열어도 다른 쓰레드는 읽을 수 있는건지...
아니면 여러 쓰레드가 동시에 하나의 파일을 열 수 있는 다른 함수가 있는건지 궁금하네요.
Forums:


dup라는 함수를
dup라는 함수를 리용하여 화일을 공유할수 있습니다.
dup(화일 데스크립터) : 파라메터로 이미 읽은 화일의 디스크립터를 줍니다.
file pointer를 전달해 주면 access 가능합니다.
같은 process 내의 다른 thread 라면, memory space를 공유하기 때문에 file 등도 같이 사용할 수 있습니다.
따라서 fopen으로 열은 file의 pointer만 공유해 준다면 다른 thread에서도 open한 file을 access할 수 있습니다.
공유하는 방법이야, fp 를 전역변수로 둔다거나, 아니면 ipc등을 이용하여 전달해 준다거나 하는 여러 방법이 있을 수 있겠지요.
오히려 이런 식으로 서로 다른 thread가 같은 file pointer를 사용할 경우에는 file 내의 위치가 내가 생각한 대로 동작하지 않게될 확률이 높아 (서로 다른 두 thread가 동시에 같은 file pointer로 access하려 한다거나 할 때) 문제가 될 수 있습니다.
위의 분이 말씀하신 dup 는 보통 pipe나 redirection 등을 구현하기 위해 사용하지 않던가요... fopen에서 사용하는 file pointer가 아닌, open 등에서 사용하는 file descripter를 복사하는 함수(더 정확히는 system call)인 걸로 알고 있습니다만...
각 쓰레드마다 fopen()해서 fread()하면 되지 않나요?
Write를 하지 않고 읽기만 한다면 dup를 안써도 각 쓰레드마다 fopen()해서 fread()하면 되지 않나요?
물론 프로세스마다 열 수 있는 파일디스크립터가 보통 1024개이니 1024(표준입력/출력/에러 포함)정도만
열 수 있겟지만 그 이하에 대해서는 잘 동작할 것 같은데요.
시스템에서 파일디스크립터별로 다르게 동작하는 걸로 알고 있습니다.
잘 기억은 안나지만
잘 기억은 안나지만
fopen으로 열고도 락을 얻을수 있는걸로 알고 있습니다.
lock을 걸지 않고 연다면 가능할듯합니다.
만약 fopen 으로 안된다면 걍 open 으로 fd 를 얻어온다면
읽어들이는데 아무 문제 없을듯 합니다.
============
언제나 시작
언제나 시작