Find the answer to your Linux question:
Results 1 to 6 of 6
Hi, I have read() blocked on a file in one thread and I need to close() the file from another thread. What is the safest way to do it? TIA...
  1. #1
    Just Joined!
    Join Date
    May 2009
    Posts
    6

    Closing a file blocked on Read

    Hi,

    I have read() blocked on a file in one thread and I need to close() the file from another thread. What is the safest way to do it?

    TIA

  2. #2
    Linux Guru Rubberman's Avatar
    Join Date
    Apr 2009
    Location
    I can be found either 40 miles west of Chicago, or in a galaxy far, far away.
    Posts
    8,974
    You need to interrupt the reading thread so it can stop the operation. Or, you should be able to close the file, and the reading thread should return from the operation with an error. I don't know for sure if that will work since I haven't personally tried it.
    Sometimes, real fast is almost as good as real time.
    Just remember, Semper Gumbi - always be flexible!

  3. #3
    Just Joined!
    Join Date
    May 2009
    Posts
    6
    I tried the option of closing the file descriptor but the other thread blocked on read does not return from read(). Any other suggestions anyone?

  4. #4
    Linux Guru Rubberman's Avatar
    Join Date
    Apr 2009
    Location
    I can be found either 40 miles west of Chicago, or in a galaxy far, far away.
    Posts
    8,974
    You need to interrupt the reader thread. Usually it is a good idea to set a timer to interrupt a read for just such cases. I'm not sure that interrupting the reader thread itself will pull it out of the kernel operation that read(0 entails. You might want to rethink your design to avoid such "race" conditions.
    Sometimes, real fast is almost as good as real time.
    Just remember, Semper Gumbi - always be flexible!

  5. #5
    Just Joined!
    Join Date
    Jun 2009
    Location
    Toronto
    Posts
    18
    You could open your file with a non-blocking file handle and then use select() to read from it. This way your reader would know when the file was closed, because there would be an error on the read.

  6. #6
    Trusted Penguin Cabhan's Avatar
    Join Date
    Jan 2005
    Location
    Seattle, WA, USA
    Posts
    3,230
    You can use the system call tkill() to send a signal to a specific thread. You will obviously need to create a handler for whatever signal you send, but remember that handlers are per-process, whereas this signal will be per-thread.

    I disagree with Rubberman's claim that you should set a timer to catch this, however. Timers work on a predetermined time limit, which may or may not correspond to the particular case. Having the thread interrupted by another thread once it must be interrupted ensures that it will not be interrupted too early.


    Before doing any of this, by the way, I would recommend figuring out why your thread is blocking, and addressing that instead. It may be possible to handle this condition in the reader thread, and simplify matters drastically.
    DISTRO=Arch
    Registered Linux User #388732

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  
...