草庐IT

非阻塞

全部标签

c - 当为 stdout 打开非阻塞 I/O 时,操作系统也为 stdin 打开它是否正确?

我注意到在OSX和Linux上都有一些意外的行为。为标准输出打开非阻塞I/O(使用O_NONBLOCK)也会为标准输入打开它!这些操作系统的行为是否正确?如果是这样,这种行为是由POSIX定义的吗?如果是这种情况,请指出相关文档。这是我用来测试这个的示例程序:#include#include#include#includeintmain(intargc,char*argv[]){intflags=fcntl(STDOUT_FILENO,F_GETFL);if(argc>1&&strcmp(argv[1],"1")==0){fcntl(STDOUT_FILENO,F_SETFL,flag

c - 对文件系统的非阻塞访问

当编写一个非阻塞程序(处理多个套接字)时,在某个时候需要使用open(2)、stat(2)文件打开文件或使用opendir(2)打开目录,我如何确保系统调用不阻塞?在我看来,除了使用线程或fork(2)之外别无选择。 最佳答案 正如MelNicholson回复的那样,对于所有基于文件描述符的内容,您都可以使用select/poll/epoll.对于其他一切,您可以使用smallstack为每项代理线程(或线程池)。这将(通过内核调度程序)将任何同步阻塞等待转换为使用eventfd选择/轮询/支持epoll的异步事件或unixpipe

c - 对文件系统的非阻塞访问

当编写一个非阻塞程序(处理多个套接字)时,在某个时候需要使用open(2)、stat(2)文件打开文件或使用opendir(2)打开目录,我如何确保系统调用不阻塞?在我看来,除了使用线程或fork(2)之外别无选择。 最佳答案 正如MelNicholson回复的那样,对于所有基于文件描述符的内容,您都可以使用select/poll/epoll.对于其他一切,您可以使用smallstack为每项代理线程(或线程池)。这将(通过内核调度程序)将任何同步阻塞等待转换为使用eventfd选择/轮询/支持epoll的异步事件或unixpipe

c - 非阻塞网络地址解析(gethostbyname 或 getaddrinfo)?

使用经典的nsswitch.conf配置:hosts:filesdns如果DNS没有响应(或配置错误),尝试使用gethostbyname(或getaddrinfo)解析名称可能需要一段时间。有没有办法在nsswitch.conf中配置超时或使用管理超时的替代API? 最佳答案 有getaddrinfo_a,但它是Linux-specificGNUglibc特定的。或者,您可以生成一个线程并在其中调用getaddrinfo。不要在线程中使用gethostbyname,因为它不是thread-safe.

c - 非阻塞网络地址解析(gethostbyname 或 getaddrinfo)?

使用经典的nsswitch.conf配置:hosts:filesdns如果DNS没有响应(或配置错误),尝试使用gethostbyname(或getaddrinfo)解析名称可能需要一段时间。有没有办法在nsswitch.conf中配置超时或使用管理超时的替代API? 最佳答案 有getaddrinfo_a,但它是Linux-specificGNUglibc特定的。或者,您可以生成一个线程并在其中调用getaddrinfo。不要在线程中使用gethostbyname,因为它不是thread-safe.

linux - 为什么非阻塞 TCP connect() 在 Linux 上偶尔会这么慢?

我试图测量我正在编写的TCP服务器的速度,我注意到测量connect()调用的速度可能存在一个基本问题:如果我以非阻塞方式连接方式,connect()操作在几秒钟后变得非常慢。这是Python中的示例代码:#!/usr/bin/python2.4importerrnoimportosimportselectimportsocketimportsysimporttimedefNonBlockingConnect(sock,addr):#time.sleep(0.0001)#Fixestheproblem.whileTrue:try:returnsock.connect(addr)exce

linux - 为什么非阻塞 TCP connect() 在 Linux 上偶尔会这么慢?

我试图测量我正在编写的TCP服务器的速度,我注意到测量connect()调用的速度可能存在一个基本问题:如果我以非阻塞方式连接方式,connect()操作在几秒钟后变得非常慢。这是Python中的示例代码:#!/usr/bin/python2.4importerrnoimportosimportselectimportsocketimportsysimporttimedefNonBlockingConnect(sock,addr):#time.sleep(0.0001)#Fixestheproblem.whileTrue:try:returnsock.connect(addr)exce

c - waitpid 在不应该的时候阻塞

我正在编写一个mini-shell(不,不是为了学校:P;为了我自己的乐趣),现在大部分基本功能已经完成,但我在尝试处理SIGTSTP时遇到了困难。据推测,当用户按下Ctrl+Z时,如果存在SIGTSTP,则应将SIGTSTP发送到shell的Foreground进程,Shell应正常继续。创建每个进程(如果是前台进程)后,等待以下代码:if(waitpid(pid,&processReturnStatus,WUNTRACED)>0){//waitstoppedtooif(WIFEXITED(processReturnStatus)||WIFSIGNALED(processReturn

c - waitpid 在不应该的时候阻塞

我正在编写一个mini-shell(不,不是为了学校:P;为了我自己的乐趣),现在大部分基本功能已经完成,但我在尝试处理SIGTSTP时遇到了困难。据推测,当用户按下Ctrl+Z时,如果存在SIGTSTP,则应将SIGTSTP发送到shell的Foreground进程,Shell应正常继续。创建每个进程(如果是前台进程)后,等待以下代码:if(waitpid(pid,&processReturnStatus,WUNTRACED)>0){//waitstoppedtooif(WIFEXITED(processReturnStatus)||WIFSIGNALED(processReturn

c - 如何让线程休眠/阻塞纳秒(或至少毫秒)?

如何将我的线程(可能是进程)阻塞纳秒或毫秒(至少)?请注意我不能使用sleep,因为sleep的参数总是以秒为单位。 最佳答案 nanosleep或clock_nanosleep是您应该使用的功能(后者允许您指定绝对时间而不是相对时间,并使用单调时钟或其他时钟而不是而不仅仅是实时时钟,如果运算符(operator)重置它可能会倒退)。但是请注意,就分辨率而言,您很少会超过几微秒,并且它总是将sleep持续时间四舍五入,而不是四舍五入。(无论如何向下舍入通常是不可能的,因为在大多数机器上,进入和退出内核空间需要超过一微秒。)此外,如果