하나의 파일을 여러 쓰레드에서 읽을 수 있을까요?

mg2000의 이미지

안녕하세요.

제가 멀티스레드로 돌아가는 프로그램을 만들다가...

fopen/fread 함수를 이용해서 파일을 열면, 가장 먼저 이 파일을 연 쓰레드는 아무 문제 없이 파일을

읽을텐데, 다른 쓰레드들은 이 쓰레드가 연 파일을 읽을 수 없을 것 같은데요.

fopen으로 열어도 다른 쓰레드는 읽을 수 있는건지...

아니면 여러 쓰레드가 동시에 하나의 파일을 열 수 있는 다른 함수가 있는건지 궁금하네요.

suh0424의 이미지

dup라는 함수를 리용하여 화일을 공유할수 있습니다.
dup(화일 데스크립터) : 파라메터로 이미 읽은 화일의 디스크립터를 줍니다.

molla의 이미지

같은 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)인 걸로 알고 있습니다만...

harisoo의 이미지

Write를 하지 않고 읽기만 한다면 dup를 안써도 각 쓰레드마다 fopen()해서 fread()하면 되지 않나요?
물론 프로세스마다 열 수 있는 파일디스크립터가 보통 1024개이니 1024(표준입력/출력/에러 포함)정도만
열 수 있겟지만 그 이하에 대해서는 잘 동작할 것 같은데요.
시스템에서 파일디스크립터별로 다르게 동작하는 걸로 알고 있습니다.

alwaysN00b의 이미지

잘 기억은 안나지만
fopen으로 열고도 락을 얻을수 있는걸로 알고 있습니다.

lock을 걸지 않고 연다면 가능할듯합니다.

만약 fopen 으로 안된다면 걍 open 으로 fd 를 얻어온다면
읽어들이는데 아무 문제 없을듯 합니다.

============
언제나 시작

언제나 시작

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.