Tag: 选择

Linux C选择:管道回显到输入工作,但从键盘读取不?

我想了解http://beej.us/guide/bgnet/examples/select.c (包含在下面以供参考)。 我这样做: :~$ cat /etc/issue Ubuntu 10.04 LTS \n \l :~$ gcc –version gcc (Ubuntu 4.4.3-4ubuntu5) 4.4.3 :~$ wget http://beej.us/guide/bgnet/examples/select.c :~$ gcc select.c -o select :~$ echo “ff” | ./select A key was pressed! :~$ ./select TYPINGTYTimed out. :~$ cat /etc/issue Ubuntu 10.04 LTS \n \l :~$ gcc –version gcc (Ubuntu 4.4.3-4ubuntu5) 4.4.3 :~$ […]

如果用户输入内容,则在语句之间切换:无限且超时

为了更清楚地解释我想要做什么,我希望我的代码检查用户是否输入了一些东西(或者如果另一个文件描述符超过0有数据要读取)每个(比方说)2.5秒,直到程序停止。 如果用户输入内容,则简单的printf()将通知他,然后程序将再次检查用户是否在接下来的2.5秒内输入了内容。 否则,它应该只是打印时间用完,然后在接下来的2.5秒内再次检查用户输入。 这是我从Beej的网络编程指南中窃取的代码片段,并修改为(尝试)满足我的要求: #include #include #include #include #define STDIN 0 // file descriptor for standard input int main(void){ struct timeval tv; fd_set readfds; FD_ZERO(&readfds); FD_SET(STDIN, &readfds); tv.tv_sec = 2; tv.tv_usec = 500000; while(1){ select(STDIN+1, &readfds, NULL, NULL, &tv); if (FD_ISSET(STDIN, &readfds)){ printf(“A key was pressed!\n”); tv.tv_sec = 2; tv.tv_usec = 500000; }else{ printf(“Timed out.\n”); […]

select()函数最后不允许printf()没有“\ n”

我使用select()时遇到问题:它在我的程序中表现得很奇怪,我无法理解为什么。 #include #include int main() { char msg[1024]; fd_set readfds; int stdi=fileno(stdin); FD_SET(stdi, &readfds); for (;;) { printf(“Input: “); select(stdi+1, &readfds, NULL, NULL, NULL); if (FD_ISSET(stdi, &readfds)) { scanf(“%s”,msg); printf(“OK\n”); } } } 你期望什么程序行为? 可能和我一样(123是我输入的字符串): Input: 123 OK 但真正的程序行为如下所示: 123 Input: OK 让我们将调用printf(“Input:”)中的争论更改为“Input:\ n”。 我们得到的是 Input: 123 OK 所以select()函数是冻结输出,直到下一个以“\ n”结尾的printf()。 我能做些什么才能得到我期望的行为?

套接字超时:它有效,但为什么以及如何,主要是select()函数?

这是我现在使用的代码的一部分。 fd_set fdset; struct timeval tv; int flags = fcntl(sockfd, F_GETFL); fcntl(sockfd, F_SETFL, O_NONBLOCK); connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr)); FD_ZERO(&fdset); FD_SET(sockfd, &fdset); tv.tv_sec = 3; tv.tv_usec = 0; if (select(sockfd + 1, NULL, &fdset, NULL, &tv) == 1) { int so_error; socklen_t len = sizeof so_error; getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &so_error, &len); if (so_error == 0) { cout […]

STDIN和Incoming Socket上的select()

我正在尝试用C编写一个非常基本的聊天客户端,它使用套接字与另一台机器进行通信,而我在理解select时遇到了一些问题。 这是相关代码的快速片段。 while(1) { FD_ZERO(&readfds); FD_ZERO(&writefds); FD_SET(STDIN, &writefds); FD_SET(connectFD, &readfds); select(connectFD+1, &readfds, &writefds, NULL, NULL); if(FD_ISSET(connectFD, &readfds) != 0) { char buf[1024]; memset(buf, 0, sizeof(buf)); int lastBit; lastBit = recv(connectFD, buf, sizeof(buf), 0); if (lastBit > 0 && lastBit < 1024) { buf[lastBit] = '\0'; } else { close(connectFD); break; } printf("%s\n", buf); } else […]

哪个是在包含非唯一元素的未排序数组中选择第k个最大数字的最快算法?

可能重复: 如何在O(n)中找到长度为n的未排序数组中的第k个最大元素? 元素数量可以在1到1千万之间变化。这是最快的选择算法吗? 请注意我认为由于数组元素的重复,像AVL Trees这样的数据结构在这里不起作用?

使用Select区分套接字

我正在制作一个侦听多个端口的TCP / IP服务器。 我选择使用select来启用多个事件的处理。 所以此刻,我有两个sockets,连接到两个不同的端口(3000,3001)。 一旦我进入选择循环,我希望服务器根据它当前处理的端口做出不同的响应。 如果在选择内部,我怎么能分辨出我在哪个sockets? 我正在为我的选择循环添加代码,希望你们能指出我正确的方向。 请注意,这是在我将两个文件描述符添加到集合后开始的。 while(1) { /* Block until input arrives on one or more active sockets. */ readfds = activefds; if (select (FD_SETSIZE, &readfds, NULL, NULL, NULL) < 0) { perror ("select"); exit (EXIT_FAILURE); } /* Service all the sockets with input pending. */ for (i = 0; i […]

在客户端上使用select(..)

我正在尝试在客户端实现select(..),从服务器创建除TCP套接字到recv(..)之外的多个套接字。 我想接收使用select(..)创建的不同套接字的不同recv(..)的数据。 代码似乎没有按预期运行。 请帮忙。 谢谢! #include #include #include #include #include #include #include #include #include int main(int argc, char *argv[]) { int count, createsocket, chunks, newsocket[5], i; int bufsize = 2048; char *buffer = malloc(bufsize); char fname[256]; struct sockaddr_in address; fd_set master; fd_set read_fds; int fdmax, j; FD_ZERO(&master); FD_ZERO(&read_fds); if((createsocket = socket(AF_INET, SOCK_STREAM, 0)) > 0) […]

C – stdin缓冲区中已有数据时,在stdin上选择()

select函数阻止调用进程,直到在任何指定的文件描述符集上存在活动[…]如果读取调用不会阻塞,则认为文件描述符已准备好进行读取。 (参见: https : //www.gnu.org/software/libc/manual/html_node/Waiting-for-I_002fO.html ) 所以我预计,如果你在第一次迭代中输入一个> 4个字符的字符串,那么在下面的程序中选择将立即返回第二个…迭代。 但事实并非如此。 在第一次输出后按任何其他键之后,它继续处理所有剩余的输入。 为什么? 样本输出: ./selectTest 12345678900 Keyboard input received: 1234 A Keyboard input received: 5678 Keyboard input received: 900 Keyboard input received: A 码 #include #include #include #include int main(void) { fd_set rfds; char buf[100]; while(1) { FD_ZERO(&rfds); FD_SET(fileno(stdin), &rfds); if(-1 == select(FD_SETSIZE, &rfds, NULL, NULL, NULL)) […]

将stdout与stderr区分开来

popen()替代方案 我的问题与上面发布的问题有关。 在第一个/接受的回复中,我们正在做: // Child. Let’s redirect its standard output to our pipe and replace process with tail close(pipefd[0]); dup2(pipefd[1], STDOUT_FILENO); dup2(pipefd[1], STDERR_FILENO); 但我想要的是区分ERROR和常规OUTPUT 。 我怎样才能做到这一点? 当我在STDERR得到任何东西时,我需要对它做出反应。 它没有多大意义,但是,我可以遵循吗?: int pipefd[3] /* instead of 2 */ dup2(pipefd[1], STDOUT_FILENO); dup2(pipefd[2], STDERR_FILENO); 我正在使用select来查看fd并查看输出是否可用。 但到现在为止,我只需要看看1 fd,现在我要看2。 注意 :管道只能有两个端部,对吗? 一个写入和另一个读取。 我怎样才能适应这个第三端:D ??