首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在普通磁盘文件上使用select相似函数

在普通磁盘文件上使用select相似函数
EN

Stack Overflow用户
提问于 2016-06-27 14:59:03
回答 2查看 130关注 0票数 0

我有一台电脑,把一些传感器的数据记录到8个不同的文件中。我开发了一个软件,当您使用rj45电缆连接这两台计算机时,可以将这些数据复制到另一台计算机上。

在我的计算机上检索数据后,我需要使用伪串行(使用套接字)逐行发送每个文件。

我创建了一个程序,它使用嵌套的for循环来检查所有8个文件中的数据是否已经就绪,然后提取一行并将其发送到puttySX。

问题是CPU的使用。减少这种情况的一种方法是使用阻塞函数来知道数据是否可以读取,但是除了这样的文件之外,是否还有类似select的套接字或串行端口之类的函数?

如果没有,我该怎么办?谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-30 10:33:22

所以,

我发帖回答我的问题。多亏了yoones,我找到了一些窍门来做到这一点。

创建日志文件时,我在ini文件中将bool设为true,如下所示

代码语言:javascript
运行
复制
[CreatedFiles]
cli1=false
cli2=false
cli3=false
cli4=false
cli5=false
cli6=false
cli7=false
cli8=false 

另一个程序使用inotify来检测相应文件中的创建和修改。一旦进行了一些更改,它将读取ini文件,处理数据,当它完成读取数据时,它将删除日志文件,并在相应行的ini文件中写入false。

由于我必须在同一时间处理多个日志文件,每次读取一行时,我都会验证我的ini文件,看看是否也必须开始处理另一个日志文件,以便在同一时间启动多个进程。

我做了一个无限的while循环,所以当所有进程完成时,程序返回到select调用,等待一些更改,而不是消耗所有CPU的资源。

对不起,如果我不太清楚,英语不是我的母语。

谢谢大家的回复和评论。

票数 0
EN

Stack Overflow用户

发布于 2016-06-27 16:17:19

您可以查看inotify,它允许您监视文件系统事件。

下面是一个让您开始工作的示例代码(这不是生产代码):

代码语言:javascript
运行
复制
#include <stdio.h>
#include <stdlib.h>
#include <sys/inotify.h>

#define BUF_LEN (sizeof(struct inotify_event) * 1)

int main(int argc, char *argv[])
{
  char *filepath;
  int fd, wd;
  struct inotify_event *event;
  char buf[BUF_LEN];
  ssize_t ret;

  if (argc != 2)
    {
      fprintf(stderr, "Usage: ./%s <filepath>\n", argv[0]);
      return (EXIT_FAILURE);
    }
  filepath = argv[1];

  /* Initialization */
  fd = inotify_init();
  if (fd == -1)
    {
      perror("inotify_init()");
      return (EXIT_FAILURE);
    }

  /* Specify which file to monitor */
  wd = inotify_add_watch(fd, filepath, IN_MODIFY);
  if (wd == -1)
    {
      perror("inotify_add_watch");
      close(fd);
      return (EXIT_FAILURE);
    }

  /* Wait for that file to be modified, */
  /* and print a notification each time it does */
  for (;;)
    {
      ret = read(fd, buf, BUF_LEN);
      if (ret < 1)
        {
          perror("read()");
          close(fd);
          return (EXIT_FAILURE);
        }
      event = (struct inotify_event *)buf;
      if (event->mask & IN_MODIFY)
        printf("File modified!\n");
    }
  close(fd);
  return(EXIT_SUCCESS);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38057250

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档