這裏我有一些問題,當在多線程案例中使用打開pthread_cancel()
。在線程中,我需要打開一些文件來閱讀。如何知道文件描述符是否打開?
所以我的第一個問題是,我是否需要附上我使用那些打開的文件描述符pthread_cleanup_push()
和pthread_cleanup_pop()
的字段。我認爲,如果線程被取消,文件仍然打開,它不會好。
但是,據我所知,open()
函數本身是一個可能的取消點。並且我不知道是否打開文件描述符(如果發生取消)(或者我可以從哪裏獲得該文件的信息?)
最後,是否有一個Unix接口來告訴文件描述符是否打開還是不打開?
你確定*如果取消在'open'中發生,文件描述符保證不會被打開?我在POSIX中看到的唯一可以做出這種保證的語言是「在函數調用期間暫停取消請求時的行爲的副作用與在單線程中可能出現的副作用相同程序當一個函數的調用被一個信號中斷,並且給定的函數返回[EINTR]「,並且我不相信'open'不會在EINTR失敗時不打開文件(*不管*標準在這一點上說)。 – zwol
直到open()調用成功返回,文件描述符纔會打開,就是說它不是取消點。應用程序無法知道將要返回哪個文件描述符(好吧,它有順序分配,當前打開的最低文件描述符屬性,但在多線程應用程序中很難確定)。所以,必須由內核來跟蹤事情,直到open()成功返回。 –
我想象中的特定場景(如果不是徹底違反合規性,這將成爲C庫中的QoI錯誤,但這是我可以輕易想象的現存錯誤)是檢查取消立即發生在系統調用返回到用戶空間之後 - 在一個或兩個指令中,在libc存根返回之前。因此,就內核而言,系統調用成功並且文件處於打開狀態,但在取消線程之前,應用程序沒有機會對其執行任何操作。 – zwol