select函数监控一个或多个文件描述符状态程序

/* 一个文件描述符监控 */
#include <stdio.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>

#define PATH "/tmp/test_file"

int main (void)
{
	int fd = 0;
	int fd_max = 0;
	fd_set fd_sets;
	fd_set handle_sets;
	int rs = 0;
	char buff[128] = {0};
	int i = 0;

	fd = open (PATH, O_RDWR | O_CREAT, 0664);
	if (fd <= 0)
		perror ("open:");

	FD_ZERO (&fd_sets);
	FD_SET (fd, &handle_sets);
	if (fd > fd_max) {
		fd_max = fd;
	}
	while (1) {
		if (i >= 1)
			break;
		fd_sets = handle_sets; // 保存handle_sets
		rs = select (fd_max + 1, &fd_sets, NULL, NULL, NULL);
		if(rs < 0)
		{
			if(errno == EINTR)
			{
				continue;
			}
			else
			{
				break;
			}
		}
		else if(rs == 0)
		{
			continue;
		}
		else
		{
			if (FD_ISSET (fd, &fd_sets)) {
				rs = read (fd, buff, sizeof (buff));
				if (rs <= 0) {
					continue;
				}
				printf ("buff = %s\n", buff);
				lseek (fd, 0, SEEK_SET);
				i++;
			}
		}
	}

	return 0;
}


/* 三个(多个)文件描述符监控 */
#include <stdio.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>

#define PATH1 "/tmp/test_file1"
#define PATH2 "/tmp/test_file2"
#define PATH3 "/tmp/test_file3"

typedef struct device_file {
	char *file_name;
	int	  fd;
} device_file_t;

static device_file_t g_device_file[] =
{
	{PATH1, 0},
	{PATH2, 0},
	{PATH3, 0},
};

int main (void)
{
	int fd = 0;
	int fd_max = 0;
	fd_set fd_sets;
	fd_set handle_sets;
	int rs = 0;
	int i = 0;
	int index = 0;
	char buff[128] = {0};

	FD_ZERO (&fd_sets);
	for (index = 0; index < sizeof (g_device_file)/sizeof (device_file_t); index++)
	{
		fd = 0;
		fd = open (g_device_file[index].file_name, O_RDWR | O_CREAT, 0664);
		if (fd <= 0)
			perror ("open:");

		g_device_file[index].fd = fd;
		FD_SET (fd, &handle_sets);
		if (fd > fd_max) {
			fd_max = fd;
		}
	}

	while (1) {
		if (i >= 1)
			break;
		fd_sets = handle_sets; 
		rs = select (fd_max + 1, &fd_sets, NULL, NULL, NULL);
		if(rs < 0)
		{
			if(errno == EINTR)
			{
				continue;
			}
			else
			{
				break;
			}
		}
		else if(rs == 0)
		{
			continue;
		}
		else
		{
			for (index = 0; index < sizeof (g_device_file)/sizeof (device_file_t); index++) {
				fd = g_device_file[index].fd;
				if (FD_ISSET (fd, &fd_sets)) {
					rs = read (fd, buff, sizeof (buff));
					if (rs <= 0) {
						continue;
					}
					printf ("buff = %s\n", buff);
					lseek (fd, 0, SEEK_SET);
					i++;
				}
			}
		}
	}

	return 0;
}

验证结果:



  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

姜源Jerry

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值