【问题标题】:File reading synchronously in Linux C在 Linux C 中同步读取文件
【发布时间】:2013-10-25 10:06:21
【问题描述】:

请看下面的代码。

#include < stdio.h >    
#include < fcntl.h >    
#include < stdlib.h >    
#include < string.h >    

int main(int argc,char **argv,char **envp)
{
   int fd;
   size_t sz;
   char filebuffer[1024];
   int loop;
   fd=open("sample",O_RDONLY);
   if(fd==-1)
   {
      perror("");
      exit(1);
   }
   loop=0;
   while(++loop<300)
   {
      lseek(fd,0,SEEK_SET);
      memset(filebuffer,0,1024);
      sz=read(fd,filebuffer,1024);
      printf("%d.sz=%zd\t%s\n",loop,sz,filebuffer);
      sleep(1);
   }
   close(fd);
   return 0;
}

在这段代码中,我可以读取文件。但是当我在阅读过程中同时更改文件(阅读文件“样本”)时。然后我无法读取更改的文件。我也试过 O_SYNC 标志。但是,它仍然无法正常工作,但是 O_DIRECT is undefined 错误即将出现。如何确保我能够读取更改?第二件事,但我观察到,如果我关闭并打开文件读取,那么我可以读取更改的文件。

问题:
如何在不关闭和打开的情况下读取更改的文件?

【问题讨论】:

  • 你说,“当我更改文件时”在哪里你到底在做什么“更改”?另一个过程?另一个线程?网络卷上的另一台机器
  • 我在 ubuntu 中打开了终端,我在同一台机器上进行更改。
  • 不要在尖括号内包含空格;这是非常规的,我不相信编译器有义务正确处理这种用法。 (h-char-sequence 中允许使用空格(请参阅 §6.4.2 标头名称和 §6.10.2 源文件包含),但标准标头的名称始终不带空格 -无论您如何处理自己的标头。(Mac OS X 上的 GCC 4.8.1 拒绝带有空格的标头。)
  • 如果“...无法读取更改的文件”,如何知道确实更改了?因此问题也可能出在写入端。

标签: c linux file file-io embedded-linux


【解决方案1】:

我认为你在问以下问题:

我有一个程序可以打开一个名为sample 的文件并反复读取该文件的第一个块。这很好用。但是,如果我编辑文件sample,例如使用文本编辑器,那么我的程序不会看到更改,尽管如果它关闭并重新打开文件就会看到。如何在不关闭并重新打开文件的情况下查看更改?

如果这是你的问题,那么答案是:

抱歉,您不能,因为文本编辑器不会修改文件。它使用旧名称创建一个新文件

在 Unix 中,一旦你打开一个文件,它实际上并不会被删除,即使它的名字没有被链接。如果另一个程序“删除”了该文件,然后创建了一个同名的新文件,则任何其他程序都无法再访问您打开的文件,但它仍然是同一个文件,它将在您关闭它之前不会被删除。

大多数 Unix 文本实用程序,即使是那些声称“就地”工作的工具(例如 sed -i),实际上都不会修改文件。这包括文本编辑器。所以你的程序看不到文件的变化,因为文件没有变化;该名称已被赋予一个新文件。

因此,解决此问题的唯一方法是关闭并重新打开文件。重新打开时,您将使用旧名称打开新文件。

【讨论】:

    【解决方案2】:

    文件中没有更新数据的原因可能是文件系统中的同步时间。

    我建议在写入文件后fflush()。这使您的缓存数据写入文件。

    相关讨论。

    Small file not committed to disk for over a minute

    Is fwrite non-blocking?

    【讨论】:

      【解决方案3】:

      这是对您的代码的改编。它分叉创建两个进程。子代码包含您的代码,基本未更改(不同的错误消息、文件名变量,并且更注意打印不是空终止的filebuffer)。父级将字符(相同的字符,一遍又一遍)写入文件。

      #include <fcntl.h>
      #include <stdio.h>
      #include <stdlib.h>
      #include <string.h>
      #include <unistd.h>
      
      static char const filename[] = "sample";
      
      int main(void)
      {
          int fd;
          size_t sz;
          char filebuffer[1024];
          int loop;
      
          switch (fork())
          {
          case -1:
              fprintf(stderr, "Failed to fork\n");
              break;
      
          case 0:
              sleep(1);
              fd = open(filename, O_RDONLY);
              if (fd == -1)
              {
                  fprintf(stderr, "Failed to open file %s for reading\n", filename);
                  exit(1);
              }
              loop = 0;
              while (++loop < 300)
              {
                  lseek(fd, 0, SEEK_SET);
                  memset(filebuffer, 0, 1024);
                  sz = read(fd, filebuffer, 1024);
                  printf("%d.sz=%zd\t%.*s\n", loop, sz, (int)sz, filebuffer);
                  sleep(1);
              }
              close(fd);
              break;
      
          default:
              fd = open(filename, O_WRONLY|O_CREAT, 0644);
              if (fd == -1)
              {
                  fprintf(stderr, "Failed to create file %s for writing\n", filename);
                  exit(1);
              }
              for (loop = 0; loop < 256; loop++)
              {
                  memset(filebuffer, (loop % 64) + 33, sizeof(filebuffer));
                  lseek(fd, 0L, SEEK_SET);
                  write(fd, filebuffer, sizeof(filebuffer));
                  sleep(1);
              }
              close(fd);
              break;
          }
      
          return 0;
      }
      

      示例输出:

      1.sz=1024   """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
      2.sz=1024   ################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################
      3.sz=1024   ################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################
      4.sz=1024   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
      5.sz=1024   &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
      6.sz=1024   ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
      7.sz=1024   ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
      8.sz=1024   ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
      9.sz=1024   ****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************
      

      如您所见,进程异步运行,因此文件中的数据在读取之间并不总是发生变化,但进程会看到变化。

      尝试在您的计算机上运行它。它应该工作。 (来自 Mac OS X 10.8.5 的示例输出。)如果没有,您需要确定您拥有的文件系统类型,但我认为这不会有问题。

      【讨论】:

        猜你喜欢
        • 2011-04-18
        • 1970-01-01
        • 2013-06-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-10
        • 1970-01-01
        相关资源
        最近更新 更多