我想从本文中描述的同一个线程中的subprocess读取stdout和stderr 。 在Python2.7中运行代码时,按照预期工作,Python3.3中的select()调用似乎不是它应该的。 看看这里是一个脚本,它会在stdout和stderr上打印两行,然后等待,然后重复这个过程: import time, sys for i in range(5): sys.stdout.write("std: %d\n" % i) sys.stdout.write("std: %d\n" % i) sys.stderr.write("err: %d\n" % i) sys.stderr.write("err: %d\n" % i) time.sleep(2) 有问题的脚本将在subprocess中启动上面的脚本,并按照发布的链接中的描述读取它的stdout和stderr : import subprocess import select p = subprocess.Popen(['/usr/bin/env', 'python', '-u', 'test-output.py'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) r = [p.stdout.fileno(), p.stderr.fileno()] while p.poll() is None: print("select") ret = select.select(r, [], […]
我在没有超时select(sock+1, &rfd, NULL, NULL, NULL)阻塞套接字上做select() select(sock+1, &rfd, NULL, NULL, NULL) 。 这发生在一个线程,其目标是调度传入的数据。 另一个监视线程正在pipe理对等体的活动状态,当它检测到死连接时,它将closures套接字。 在这种情况下,我期待select()返回-1 。 它在Windows上执行,但从不在Linux上执行,所以当对方不正常地消失时,调度线程永远被locking。 为了完整性,还有未完成的数据要传输,我试图与SO_LINGER玩,但这并没有改变任何东西。 这个问题可以通过在select()设置一个超时来解决,在这种情况下close和timeout之后, select()最终以-1退出,但是我认为,阅读文档时select()没有超时仍然会退出closures,即使对方没有回应。 我误用了select()还是有更好的方法来处理半开放式套接字?
我的操作系统是64位Centos6.4。 我有一个关于如何fd_setpipe理FD_SET的问题添加fd.Follow代码是这样的: fd_set my_set; FD_SET(31, &my_set); 然后,我显示my_set.fds_bits […]。my_set.fds_bits [0]等于0x0000000080000000,my_set.fds_bits [1〜…]为零。我可以理解结果。但是我也写一个case ,关注代码: fd_set my_set; FD_SET(63, &my_set); 我显示my_set.fds_bits […]。my_set.fds_bits [0]等于0x0。在我看来,结果应该是my_set.fds_bits [0]等于0x8000000000000000.我真的不明白为什么第二结果是0x0。 不是等于63的fd在my_set中有一个状态。 这里是完整的testing代码: #include <stdio.h> #include <string.h> #include <errno.h> #include <sys/socket.h> #include <resolv.h> #include <stdlib.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <fcntl.h> #include <sys/time.h> #include <pthread.h> #define BUFSIZE 1024 void printFDSET(fd_set target_sets) { int uIndex = […]
我想等待文件更改或套接字input。 这两个thinsg将会发生很less,我宁愿把它们都扔到同一个线程中,而不是为了避免一点点混乱而把它们搞乱。 由于Inotify_init似乎提供了一个文件描述符,我以为我可以将它传递给select,就像我传入一个套接字一样,select将有效地监视两者。 然而,我试图谷歌它,并没有发现任何地方发生的例子,似乎如果有可能在那里会有一个例子发生在互联网上的某处。 任何人都可以validation,如果我可以传递一个从INotify descripter到一个select的方法就像我会套接字? 或者,如果有任何其他阻塞方法,将侦听文件和套接字更新? 谢谢
当我用g++ -std=c++11 <filename>编译并运行下面的代码,并运行./a.out并input一些文本来查看select调用将返回的内容(它应该返回1,因为当我input文字,然后可以读入文字)。 不知何故,我input的文本作为bash命令本身。 有人能解释为什么发生这种情况 #include <errno.h> #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/time.h> int input_timeout (int filedes, unsigned int seconds) { fd_set set; struct timeval timeout; // Initialize the file descriptor set. FD_ZERO (&set); FD_SET (filedes, &set); // Initialize the timeout data structure. timeout.tv_sec = seconds; timeout.tv_usec = 0; // select returns 0 […]
我需要等待从文件描述符A中读取的内容,然后只在文件描述符B是可写的时才读取它。 我的第一个实现是这样的(伪代码): while (true) { select(A readable, B writeable, timeout) if (A was readable and B was writeable) { ReadFromAWriteToB(); } } 这有一个问题,select返回一个条件发生的尽快。 这是一个问题,因为A是可读的,说10%的时间,但B是可写的,说90%的时间,所以它会醒来写给B,即使我们通常没有任何数据要从A读取。 我的下一个实现是这样的: while (true) { select(A readableB, timeout); if (A was readable) { select(B writeable, 0); // Check if it is writeable right now if (B was writeable) { ReadFromAWriteToB(); } } […]
在一个bash脚本中,我通过“psql -c”运行一个sql查询。 根据给予bash脚本的论点,select命令的where claus将是不同的。 所以基本上我需要知道是否有可能做这样的事情: psql -c "select statement here until we get to the where clause at which point we break out of statement and do" if (arg1 was given) concatenate "where arg1" to the end of the above select statement if (arg2 was given) concatenate "where arg2" to the end of the above […]
我的程序必须检测以太网接口何时转为RUNNING状态。 我可以通过使用ioctl()来轮询运行标志: if( ioctl( dummy_fd, SIOCGIFFLAGS, &ifr ) != -1 ) return ifr.ifr_flags & IFF_RUNNING; 但是没有轮询就立即要求信息。 目前该程序使用select()来等待其他事件。 所以使用select()来检测接口的状态变化是很好的。 有一种方法可以select ,我从网上读过。 但我不再find该页面。
select()的手册页不会列出EAGAIN作为select()函数的可能错误代码。 任何人都可以解释在哪些情况下select()可以产生EAGAIN错误? 如果我理解select_tut手册页 ,EAGAIN可以通过发送一个信号到阻塞的进程被阻塞等待被阻塞的select()。 它是否正确? 由于我在超时阻塞模式下使用select(),如下所示: bool selectRepeat = true; int res = 0; timeval selectTimeout( timeout ); while ( true == selectRepeat ) { res = ::select( fd.Get() + 1, NULL, &writeFdSet, NULL, &selectTimeout ); selectRepeat = ( ( -1 == res ) && ( EINTR == errno ) ); } 当错误号是EAGAIN时,我应该重复循环吗?
select (2)(除其他外)告诉我是否可以写入文件的一个fd而不会阻塞。 但是,它保证我可以写满4096字节没有阻塞? 注意我对磁盘上的普通文件感兴趣。 不是sockets之类的。 换句话说,当我们可以在没有阻塞的情况下将一个单字节写入文件fd时select信号, 或者当我们可以在不阻塞的情况下将n (4096,…?)字节写入到文件fd时发出信号。