select 设置等待时间和NULL初步研究

select 的用法

[answer1] : 可以在linux 发行版本终端下敲入"man select" 查看select的基本介绍,返回值,和一些你可能看的懂得任何信息

但是想真正理解用法,还是要多看网上例子以及自己切身的调试经验。

基础信息, 下图有select的手册介绍

好了,然后就是网上铺天盖地的介绍,我是从linux必看经典编程C书册《understanding unix programming》里读到的基本的介绍

基本信息我这里先不详细赘述,主要是分享自己调试后的经验吧

主要疑惑在timeval结构体的传值。 我这里测试了两种情况 NULL  和 数值2秒

情况一:

2秒的设计,  拟设计,间隔2秒,然后看返回情况:

int len, fs_sel;
	char buffer[1024];

	fd_set fs_read;

	FD_ZERO(&fs_read);
	FD_SET(Ctrlfd, &fs_read);

	struct timeval tv;
	/* data */
	tv.tv_sec = 2;
	tv.tv_usec = 0;
	
	for (;;) 
	{
	/* code */
	 fs_sel = select(Ctrlfd+1, &fs_read,NULL, NULL, &tv);
     if(fs_sel == -1){
		printf("yes this error is %s, and the num is %d\n" ,strerror(errno), errno);
		exit(0);
	 }
     	printf("select return\n");
		if(fs_sel){
			if(FD_ISSET(Ctrlfd,&fs_read)){
				len += read(Ctrlfd, buffer,sizeof(buffer)); 
				buffer[len] = '\0';
				printf("rev: %s\n", buffer);

			}
	 	}
		FD_ZERO(&fs_read);
	 	FD_SET(Ctrlfd,&fs_read);	
		printf("fs_sel return is %d\n", fs_sel);
		tv.tv_sec = 2;
		tv.tv_usec = 0	;

	}

这种情况下,每次调用select后都要清零,再设置,然后才能再进一步调用正常。

但从输出情况才看到,并不是每个两秒才去检测一次返回值,select在这里并不是一个延时函数,一旦有“有效量”’还是会立即返回的, 2秒的设定只是一次检测的定时时间点,

应该理解为间隔2秒去做某事,实际上内核是一直在检测。

而且你还必须得重新设置一下检测量集,就是最后那5行的意义,如果你不这样,好像会一直不停的返回。时间结构体+FDSET都得重新设计。否则无法实现如愿的效果。

如果不如此设置,你将检测不到你想要的触发事件。

         FD_ZERO(&fs_read);
         FD_SET(Ctrlfd,&fs_read);

如果不如下设置,你将无法得到2秒一次的间隔效果。

不信你可以试试。

二:

NULL的情况

NULL实际上就如官方所定义的,阻塞了,实际上是基本就阻塞在调用的那个地方,等内核给你反馈就行了

代码就是去掉最后5行的调用即可。

    int len, fs_sel;
	char buffer[1024];

	fd_set fs_read;

	FD_ZERO(&fs_read);
	FD_SET(Ctrlfd, &fs_read);

	struct timeval tv;
	/* 
	tv.tv_sec = 2;
	tv.tv_usec = 0;
    */
	
	for (;;) 
	{
	/* code */
	 fs_sel = select(Ctrlfd+1, &fs_read,NULL, NULL, NULL);
     if(fs_sel == -1){
		printf("yes this error is %s, and the num is %d\n" ,strerror(errno), errno);
		exit(0);
	 }
     	printf("select return\n");
		if(fs_sel){
			if(FD_ISSET(Ctrlfd,&fs_read)){
				len += read(Ctrlfd, buffer,sizeof(buffer)); 
				buffer[len] = '\0';
				printf("rev: %s\n", buffer);

			}
	 	}
/*
		FD_ZERO(&fs_read);
	 	FD_SET(Ctrlfd,&fs_read);	
		printf("fs_sel return is %d\n", fs_sel);
		tv.tv_sec = 2;
		tv.tv_usec = 0	;
*/

有较真的同学可能会问, 为什么NULL时,不用重新设置有效集。 

这个其实很简单,因为我试过了,你加不加都他么一样。 我也不清楚上面那种情况为什么就需要加。先mark一下。

 

等待高手鞭挞指导。

引用\[1\]和\[2\]提供了关于在SQL查询中使用select null的两种思路。在这两个例子中,使用了子查询和ifnull函数来处理null值。在第一个例子中,通过在外层再套一次select,并使用select null的思路,实现了返回null的效果。而在第二个例子中,使用了ifnull函数来判断是否为空,如果为空则返回null。这些方法可以根据具体的需求和数据库系统的支持来选择使用。 引用\[3\]提供了关于null值在MySQL中的处理规则。在MySQL中,null值表示"没有数据"或"没有值"。在比较运算符和算术运算符作用于null值时,结果恒为null。在除以0的运算中,结果也是null。某些函数作用在null值上时,结果也是null,比如concat()函数。在进行distinct、group by和order by操作时,null值被视为相同。在执行order by时,如果是升序排序,null值将放在最前面;如果是降序排序,null值将放在最后面。聚合函数如count()、sum()、min()、max()等,如果作用于可能存在null的列上,会自动忽略null值。 综上所述,使用select null可以在SQL查询中返回null值,具体的处理方法可以根据具体的需求和数据库系统的支持来选择。在MySQL中,null值有特定的处理规则,需要根据具体情况进行判断和处理。 #### 引用[.reference_title] - *1* *2* [select null](https://blog.csdn.net/Gaojiaotong/article/details/124778955)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [MySql的null值及其处理](https://blog.csdn.net/zhang3361999/article/details/104354059)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值