什么是POSIX取消点?

19
什么是POSIX取消点?我正在寻找一个确定的POSIX取消点列表。
我之所以问这个问题,是因为我有一本书说accept()select()是取消点,但我在互联网上看到的一些网站声称它们不是取消点。
此外,如果Linux取消点与POSIX取消点不同,我也想要它们的列表。
3个回答

21

POSIX 1003.1-2003标准在系统接口部分、一般信息部分和线程部分(由A. Rex提供的直接链接)中给出了列表。 (添加POSIX 1003.1-2008现在可以在网上获取(PDF和HTML共3872页)。您需要注册(免费)。我从Open Group Bookstore获得了该标准。)

取消点

当线程执行以下函数时,应发生取消点:
  • accept()
  • aio_suspend()
  • clock_nanosleep()
  • close()
  • connect()
  • creat()
  • fcntl() (当cmd参数为F_SETLKW时)
  • fdatasync()
  • fsync()
  • getmsg()
  • getpmsg()
  • lockf()
  • mq_receive()
  • mq_send()
  • mq_timedreceive()
  • mq_timedsend()
  • msgrcv()
  • msgsnd()
  • msync()
  • nanosleep()
  • open()
  • pause()
  • poll()
  • pread()
  • pselect()
  • pthread_cond_timedwait()
  • pthread_cond_wait()
  • pthread_join()
  • pthread_testcancel()
  • putmsg()
  • putpmsg()
  • pwrite()
  • read()
  • readv()
  • recv()
  • recvfrom()
  • recvmsg()
  • select()
  • sem_timedwait()
  • sem_wait()
  • send()
  • sendmsg()
  • sendto()
  • sigpause()
  • sigsuspend()
  • sigtimedwait()
  • sigwait()
  • sigwaitinfo()
  • sleep()
  • system()
  • tcdrain()
  • usleep()
  • wait()
  • waidid()
  • waitpid()
  • write()
  • writev()


取消点也可能在线程执行以下函数时发生:



  • access()
  • asctime()
  • asctime_r()
  • catclose()
  • catgets()
  • catopen()
  • closedir()
  • closelog()
  • ctermid()
  • ctime()
  • ctime_r()
  • dbm_close()
  • dbm_delete()
  • dbm_fetch()
  • dbm_nextkey()
  • dbm_open()
  • dbm_store()
  • dlclose()
  • dlopen()
  • endgrent()
  • endhostent()
  • endnetent()
  • endprotoent()
  • endpwent()
  • endservent()
  • endutxent()
  • fclose()
  • fcntl() (对于任何cmd参数的值[可能除了列出的F_SETLKW].)
  • fflush()
  • fgetc()
  • fgetpos()
  • fgets()
  • fgetwc()
  • fgetws()
  • fmtmsg()
  • fopen()
  • fpathconf()
  • fprintf()
  • fputc()
  • fputs()
  • fputwc()
  • fputws()
  • fread()
  • freopen()
  • 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()
  • getpwuid()
  • getpwuid_r()
  • gets()
  • getservbyname()
  • getservbyport()
  • getservent()
  • getutxent()
  • getutxid()
  • getutxline()
  • getwc()
  • getwchar()
  • getwd()
  • glob()
  • iconv_close()
  • iconv_open()
  • ioctl()
  • link()
  • localtime()
  • localtime_r()
  • lseek()
  • lstat()
  • mkstemp()
  • mktime()
  • nftw()
  • opendir()
  • openlog()
  • pathconf()
  • pclose()
  • perror()
  • popen()
  • 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

  • 实现不得在本卷中指定的任何其他函数中引入取消点。在调用函数期间挂起并处理取消请求的副作用与单线程程序中通过信号中断调用函数并返回[EINTR]时可能看到的副作用相同。任何这样的副作用都发生在调用任何取消清理处理程序之前。只要线程启用了可取消性并且已使用该线程作为目标进行了取消请求,那么当线程调用任何是取消点(例如pthread_testcancel()或read())的函数时,取消请求将在函数返回之前被执行。如果一个线程启用了可取消性并且取消请求是针对该线程而发出的,同时线程在取消点处挂起,则线程将被唤醒并执行取消请求。但是,如果线程在取消点上挂起并且正在等待的事件在取消请求被执行之前发生,则未指定是否执行取消请求或取消请求保持挂起状态,线程恢复正常执行。URL中有关于大量可能的取消点的信息。

这是正确部分的深度链接:http://www.opengroup.org/onlinepubs/000095399/functions/xsh_chap02_09.html#tag_02_09_05_02 - A. Rex
我查看了页面源代码,这是最好的方法吗?还有其他方法吗? - Jonathan Leffler
1
是的,那就是我所做的。(嗯,我首先通过右键单击“在新标签页中打开框架”来摆脱他们烦人的框架。这样我可以快速获取HTML文件名。)你知道,我经常进行深度链接,因此拥有一个浏览器扩展程序,显示所有可能的链接点可能会很有用... - A. Rex
或者,我们可以转到主题索引http://www.opengroup.org/onlinepubs/000095399/idx/topic.html,只需点击一下即可! - A. Rex

5

3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接