19

POSIX キャンセル ポイントとは何ですか? POSIX キャンセル ポイントの決定的なリストを探しています。

accept()select()キャンセルポイントと書いてある本を持っていたので質問していますが、インターネット上でそうではないと主張しているサイトを見たことがあります。

また、Linux のキャンセル ポイントが POSIX のキャンセル ポイントと異なる場合は、それらのリストも必要です。

4

3 に答える 3

21

POSIX 1003.1-2003標準では、System Interfaces セクション、General Information、Threads ( A. Rex 提供の直接リンク) セクションにリストが示されています。(追加: POSIX 1003.1-2008が Web で入手できるようになりました (3872 ページすべて、PDF および HTML 形式)。登録が必要です (無料)。私はOpen Group Bookstoreから入手しました。)

キャンセルポイント

スレッドが次の関数を実行しているときに、キャンセル ポイントが発生します。

  • 受け入れる()
  • aio_suspend()
  • clock_nanosleep()
  • 近い()
  • 接続()
  • クリエイト()
  • fcntl() (cmd引数がF_SETLKWの場合)
  • fdatasync()
  • fsync()
  • getmsg()
  • getpmsg()
  • lockf()
  • mq_receive()
  • mq_send()
  • mq_timedreceive()
  • mq_timedsend()
  • msgrcv()
  • msgsnd()
  • msync()
  • ナノスリープ()
  • 開いた()
  • 一時停止()
  • 投票()
  • 先読み()
  • pselect()
  • pthread_cond_timedwait()
  • pthread_cond_wait()
  • pthread_join()
  • pthread_testcancel()
  • putmsg()
  • putpmsg()
  • pwrite()
  • 読んだ()
  • readv()
  • recv()
  • recvfrom()
  • recvmsg()
  • 選択する()
  • sem_timedwait()
  • sem_wait()
  • 送信()
  • sendmsg()
  • に送る()
  • sigpause()
  • sigsuspend()
  • sigtimedwait()
  • シグウェイト()
  • sigwaitinfo()
  • 寝る()
  • システム()
  • tcdrain()
  • usleep()
  • 待つ()
  • ワイディッド()
  • waitpid()
  • 書きます()
  • writev()


スレッドが次の関数を実行しているときに、キャンセル ポイントが発生することもあります。


  • アクセス()
  • asctime()
  • asctime_r()
  • catclose()
  • ネコゲット()
  • キャットオープン()
  • closedir()
  • クローズログ()
  • ctermid()
  • ctime()
  • ctime_r()
  • dbm_close()
  • dbm_delete()
  • dbm_fetch()
  • dbm_nextkey()
  • dbm_open()
  • dbm_store()
  • dlclose()
  • dlopen()
  • エンドグレント()
  • エンドホスト()
  • エンドネット()
  • endprotoent()
  • 終了しました()
  • エンドサーバント()
  • endutxent()
  • fclose()
  • fcntl() (cmd 引数の任意の値。[おそらく、リストされている F_SETLKW を除く。]
  • フラッシュ()
  • fgetc()
  • fgetpos()
  • fgets()
  • fgetwc()
  • fgetws()
  • fmtmsg()
  • fopen()
  • fpathconf()
  • fprintf()
  • fputc()
  • fputs()
  • fputwc()
  • fputws()
  • fread()
  • フリーオープン()
  • fscanf()
  • fseek()
  • fseeko()
  • fsetpos()
  • fstat()
  • ftell()
  • ftello()
  • ftw()
  • fwprintf()
  • fwrite()
  • fwscanf()
  • getaddrinfo()
  • getc()
  • getc_unlocked()
  • getchar()
  • getchar_unlocked()
  • getcwd()
  • getdate()
  • getgrent()
  • getgrgid()
  • getgrgid_r()
  • getgrnam()
  • getgrnam_r()
  • gethostbyaddr()
  • gethostbyname()
  • gethostent()
  • gethostid()
  • gethostname()
  • getlogin()
  • getlogin_r()
  • getnameinfo()
  • getnetbyaddr()
  • getnetbyname()
  • getnetent()
  • getopt() ( opterrがゼロ以外の場合。)
  • getprotobyname()
  • getprotobynumber()
  • getprotoent()
  • getpwent()
  • getpwnam()
  • getpwnam_r()
  • getpwid()
  • getpwuid_r()
  • 取得()
  • getservbyname()
  • getservbyport()
  • getservent()
  • getutxent()
  • getutxid()
  • getutxline()
  • getwc()
  • getwchar()
  • getwd()
  • グロブ()
  • iconv_close()
  • iconv_open()
  • ioctl()
  • リンク()
  • 現地時間()
  • localtime_r()
  • lseek()
  • lstat()
  • mkstemp()
  • mktime()
  • nftw()
  • opendir()
  • openlog()
  • pathconf()
  • pclose()
  • エラー()
  • 開く()
  • posix_fadvise()
  • posix_fallocate()
  • posix_madvise()
  • posix_openpt()
  • posix_spawn()
  • posix_spawnp()
  • posix_trace_clear()
  • posix_trace_close()
  • posix_trace_create()
  • posix_trace_create_withlog()
  • posix_trace_eventtypelist_getne
  • posix_trace_eventtypelist_rewin
  • posix_trace_flush()
  • posix_trace_get_attr()
  • posix_trace_get_filter()
  • posix_trace_get_status()
  • posix_trace_getnext_event()
  • posix_trace_open()
  • posix_trace_rewind()
  • posix_trace_set_filter()
  • posix_trace_shutdown()
  • posix_trace_timedgetnext_event(
  • posix_typed_mem_open()
  • printf()
  • pthread_rwlock_rdlock()
  • pthread_rwlock_timedrdlock()
  • pthread_rwlock_timedwrlock()
  • pthread_rwlock_wrlock()
  • putc()
  • putc_unlocked()
  • putchar()
  • putchar_unlocked()
  • puts()
  • pututxline()
  • putwc()
  • putwchar()
  • readdir()
  • readdir_r()
  • 削除する()
  • 名前の変更()
  • 巻き戻し()
  • rewinddir()
  • scanf()
  • シークディレクトリ()
  • セモップ()
  • セットグレント()
  • sethostent()
  • setnetent()
  • setprotoent()
  • セットした()
  • setservent()
  • setutxent()
  • 統計()
  • strerror()
  • strerror_r()
  • strftime()
  • シンボリックリンク()
  • 同期()
  • syslog()
  • tmpfile()
  • tmpnam()
  • ttyname()
  • ttyname_r()
  • tzset()
  • ungetc()
  • ungetwc()
  • リンク解除()
  • vfprintf()
  • vfwprintf()
  • vprintf()
  • vwprintf()
  • wcsftime()
  • ワードエクスプ()
  • wprintf()
  • wscanf()


実装は、IEEE Std 1003.1-2001 のこのボリュームで指定された他の機能にキャンセル ポイントを導入してはなりません。

関数の呼び出し中に中断されている間にキャンセル要求に応じた副作用は、シングルスレッド プログラムで関数の呼び出しがシグナルによって中断され、指定された関数が戻るときに見られる副作用と同じです。 [EINTR]。このような副作用は、キャンセルのクリーンアップ ハンドラーが呼び出される前に発生します。

スレッドでキャンセル機能が有効になっており、そのスレッドをターゲットとしてキャンセル要求が行われた場合、そのスレッドがキャンセル ポイントとなる関数 (pthread_testcancel() や read() など) を呼び出すと、キャンセル要求が実行されます。関数が戻る前に。スレッドがキャンセル可能であり、スレッドがキャンセル ポイントで中断されているときに、そのスレッドをターゲットとしてキャンセル要求が行われると、スレッドが起こされ、キャンセル要求が処理されます。ただし、スレッドがキャンセル ポイントで中断され、キャンセル要求が実行される前にスレッドが待機しているイベントが発生した場合、キャンセル要求が実行されるかどうか、またはキャンセル要求が保留されたままでスレッドが通常どおりに再開するかどうかは不明です。実行。

うーん!テーブルをうまく機能させることができません。プレビューでは問題なく見えましたが、その後はテーブルのようには見えませんでした。情報はURLを見てね!キャンセルの可能性があるポイントがたくさんあります。

于 2009-01-12T00:52:21.090 に答える
5

詳細かつ迅速な情報については、 pthread_cancel の man ページを参照してください。

于 2010-10-08T10:29:58.357 に答える
3

追加情報: カーネル 2.6 以降、Linux は POSIX 準拠の NPTL スレッド ライブラリを使用しているため、最近の Linux 実装のキャンセル ポイントは上記のとおりです。

http://www.ddj.com/linux-open-source/184406204

于 2009-01-12T09:23:52.240 に答える