Selecione o aplicativo do evento

Olá a todos, aqui está o blog de Shi Kankan. Este artigo apresenta o uso do mecanismo de seleção para salvar recursos da CPU. Em comparação com o multithreading, seu aplicativo é mais simples e flexível.

Para o princípio do mecanismo de seleção / votação, consulte o blog de Daniel: https://blog.csdn.net/vonzhoufz/article/details/44490675

Aqui está o uso geral de select

    

    De modo geral, o princípio do mecanismo é mais complicado, mas a API do usuário é muito simples. Você só precisa chamar a função select (int nfds, fd_set * readfds, fd_set * writefds, fd_set * exceptfds, struct timeval * timeout)

Objetivo:
monitorar vários arquivos, desde que um determinado arquivo seja legível / gravável / anormal ou horas extras, ele retornará
 int select (int nfds, fd_set * readfds, fd_set * writefds, fd_set * exceptfds, struct timeval * timeout); o
                maior arquivo Identificador +1 Se o arquivo monitorado é legível. O período de tempo limite
                                                              é monitorado. Se o arquivo gravável
                                                                                       é monitorado. Se há um arquivo anormal int nfds: Alguma compreensão e classificação do identificador. Graças a qqID: O passado acabou , apenas para referência: Handle Assim como a alça, você pode levantar algo puxando-a e também pode obter algumas coisas por meio da alça, como dados, que geralmente são indexados; por exemplo, aqui também está um índice, como um descritor de arquivo, que representa seu processo atual. O arquivo aberto, o arquivo que você abriu continuamente,    pode ser considerado como descritor de arquivo +1 aqui. Um arquivo fixo tem um descritor de arquivo fixo para determinar a quais arquivos responder  
 




Enciclopédia: Descritor de arquivo: O kernel usa descritores de arquivo para acessar arquivos. O descritor do arquivo é um número inteiro não negativo. Ao abrir um arquivo existente ou criar um novo arquivo, o kernel retorna um descritor de arquivo. Arquivos de leitura e gravação também precisam usar descritores de arquivo para especificar os arquivos a serem lidos e gravados.
fd = open (path, O_CREAT | O_RDONLY, 0644); Isso é fd;

valor de retorno: se a
execução for bem-sucedida, ele retorna o número de estados do descritor de arquivo que foram alterados. Se retornar 0, significa que o período de tempo limite foi expirou antes de o descritor mudar de estado. Retorno; quando ocorre um erro, ele retorna -1.
fd_set * readfds: 
Uma vez que há entrada, ele retorna   um buffer de tamanho fixo fd_set. Executar FD_CLR () ou FD_SET (), cujo valor é negativo ou igual ou maior que o valor fd de FD_SET-SIZE, causará um comportamento indefinido. Além disso, POSIX requer que fd seja um descritor de arquivo válido. situação do parâmetro de intervalo de tempo de struct timeval *: se o parâmetro de tempo de espera for definido como NULL, significa que a seleção () não expira e a seleção será bloqueada até que ocorra um evento no descritor de arquivo. 0: verifica apenas o estado do conjunto de descritores, e retorna imediatamente, sem esperar a ocorrência de eventos externos. Valor de tempo específico: Se nenhum evento ocorrer no período de tempo especificado, escolha retornar com o tempo. A macro a seguir fornece uma maneira de lidar com essas três frases de descrição: FD_CLR (inr fd, fd_set * set); usado para limpar os bits fd relacionados no conjunto de frases de descrição FD_ISSET (int fd, fd_set * set); usado para testar o frase descritiva Se o bit fd relevante no conjunto é verdadeiro    
 






FD_SET (int fd, fd_set * set ); frase usada para descrever o conjunto de bits associado fd é definido
FD_ZERO (fd_set * set); frase descrita usada para limpar todos os bits definidos em comum o seguinte fragmento de programa: fs_set readset; FD_ZERO (& readset ); FD_SET (fd, & readset); select (fd + 1, & readset, NULL, NULL, NULL);





if (FD_ISSET (fd, readset) {……}

Código-fonte da função: o mecanismo de seleção da tela de toque realiza a ativação da entrada 

 

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>

/**********************************************************************
 * 函数名称: main
 * 功能描述: select实现低cpu占用操作 触摸屏输入事件监测
 * 输入参数: 无
 * 输出参数: 无
 * 返 回 值: 0 - 成功, 其他值 - 失败
 * 修改日期        版本号     修改人	      修改内容
 * -----------------------------------------------
 * 2018/04/17	     V1.0	  石侃侃	      创建
 * 存在问题: select(fd+1, &rfds, NULL, NULL, &tv);  目前已经实现碰触触摸屏唤醒 (select返回)
			 但是无法识别可读可写 (&rfds在第二第三个参数都有效)而且不能判断open打开的txt文本文件 
 ***********************************************************************/
	main(void)
	{   
		
	   fd_set rfds;
	   struct timeval tv;
	   int retval;
		
	   int fd; 

	   fd=open("/dev/input/event0",O_RDONLY); /* 触摸屏设备 */
	   /* Watch stdin (fd 0) to see when it has input. */
	   FD_ZERO(&rfds);
	   FD_SET(fd, &rfds);

	   /* Wait up to five seconds. */
	   tv.tv_sec = 5;
	   tv.tv_usec = 0;

	   retval = select(fd+1, &rfds, NULL, NULL, &tv);/* 超时或者有输入则返回 */
	   /* Don't rely on the value of tv now! */

	   if (retval == -1)
		   perror("select()");
	   else if (retval)
	   {
			if(FD_ISSET(fd,&rfds))  
			{  
				printf("Data is available now   ok.\n");
				printf("retval=%d\n",retval); 
			}
			else   
			{
				printf("FD_ISSET error");  
			}  


		   }
	   else
		   printf("No data within five seconds.\n"); /* retval=0 */
	  return 0;
	}

Acho que você gosta

Origin blog.csdn.net/zxpcus/article/details/79981216
Recomendado
Clasificación