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.
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);
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;
}