关于select的一个死循环

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/select.h>
int main(int argc, char *argv[]){
    int maxfd;
    char buf[256];
    fd_set rset;
    while(1){
        FD_ZERO(&rset);
        FD_SET(STDIN_FILENO,&rset);
        select(STDIN_FILENO+1,&rset,NULL,NULL,NULL);
        if(FD_ISSET(STDIN_FILENO,&rset))
            printf("hello world!\n");
    }
    return 0;
}

  上述代码会出现死循环的情况。

select对fd的监听等同于对fd的缓冲区的监听。当fd的缓冲区有数据可读时,select返回。当输入任意字符,比如:“abc”,则“abc”被放在标准输入的缓冲当中,此时缓冲中有数据(abc)待读,所以select返回STDIN_FILENO就绪,程序输出“hello World!”。紧接着进入下一次循环,select重新将STDIN_FILENO加入监听的描述符集,由于刚刚的“abc”并没有被读出,所以仍在缓冲中,此时STDIN_FILENO的缓冲中仍有数据等待读,所以select又返回STDIN_FILENO可读就绪,又一次输出“hello world!”。之后循环情况类似,由于缓冲的的“待读”数据始终还在,所以每次select都直接返回STDIN_FILENO就绪,每次都输出“hello world!”,这就是造成程序死循环的原因。

时间: 2024-12-18 03:36:49

关于select的一个死循环的相关文章

从select的一个死循环谈epoll的ET模式

--作者:lvyilong316 最近写程序遇到一个问题,就是发现select监听标准输出的时候遇到了死循环,具体程序如下程序一.程序的意图是每当用户在控制台有任何输入,就输出"hello world!". 程序一: #include <stdio.h> #include <sys/types.h> #include <unistd.h> #include <sys/select.h> int main(int argc, char *a

Angular 1.x下 select 的一个巨大的坑

双向绑定这个特性有时让人又爱又恨 假设控制器 function($scope){ $scope.options = [{name:"alex",id:232,-},{-},{-}-]; $scope.myModel = {name:"alex",id:232}; } <select ng-model="myModel.id"> <option value="">-请选择-</option>

用select模拟一个socket server

1, 必须在非阻塞模式下,才能实现IO的多路复用,否则一个卡住就都卡住了. 先检测自己,现在没有客户端连进来,所以会卡住. # 用select去模拟socket,实现单线程下的多路复用 import select import socket import queue server = socket.socket() server.bind(('localhost', 9000)) server.listen(1024) server.setblocking(False) # 设置为不阻塞,acc

C# LINQ 中关于from和select的一个小例子

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace First_exam { class Student { /// <summary> ///学生姓名的字段和属性 /// </summary> private string _Name; public string Name { ge

android 给LinearLayout中添加一定数量的控件,并让着一定数量的控件从右到左移动,每隔若干秒停顿一下,最后一个view链接第一个view,然后继续移动循环往复,形成一个死循环简单动画效果

主类:IndexAnimationLinearLayout.java package com.yw.sortlistview; import java.util.ArrayList; import java.util.List; import android.annotation.SuppressLint; import android.content.Context; import android.graphics.Canvas; import android.os.Handler; impo

zencart产品属性dropmenu select只有一个选择项时自动变成radio单选的解决办法

includes\modules\classic\attributes.php 在大约786行代码 case ($products_options->RecordCount() == 1): 的下面找到 $options_menu[] = zen_draw_radio_field('id[' . $products_options_names->fields['products_options_id'] . ']', $products_options_value_id, 'selected'

由一个RABBITMQ监听器死循环引出的SPRING中BEAN和MAPPER接口的注入问题

1 @Slf4j 2 @RestController 3 @Component 4 public class VouchersReceiverController implements MessageListener { 5 6 @Autowired 7 private VouchersService vouchersService; 8 9 String MerchantCode = PropertyReader.getValue("MerchantCode"); 10 11 /**

关于一个数组越界之后的死循环

<span style="font-size:18px;">#include<stdio.h> void main() { int i=0; int a[5]; for (i = 0; i <= 5; i++) { a[i] = -i; printf("a[%d] = %d\n", i, a[i]); } }</span> 分析上述代码,执行结果是什么?能编译过去吗?有结果吗?结果是什么呢? 编译运行之后,发现这个程序是可以

自己写的第一个while循环之死循环

很久不来了,不是因为放弃了Linux,而是要准备编制考试,暂别Linux.但是最近脑子里还是有之前自己为自己设定的小愿望,写一个死循环,今天突然有了点所谓的灵感,把代码写出来了: #!/bin/bash # upTime=`date +%s` sum=0 add=1 while [ $upTime -gt 0 ];do let sum+=$add sleep 1 echo $sum done 用现在的总秒数时间来和0比较,因为该变量永远大于0,内在机制是时间永远不会倒流,至少一般情况下机器时间不