abhisahay
abhisahay

Reputation: 65

File is not written on disk until program ends

I'm writing a file using a c code on a unix system . I open it , write a few lines and close it. Then i call a shell script, say code B where this file is to be used and then return back to main program. However, when code B tries to read the file, the file is empty.

I checked the file on the file system, its size is shown as 0 and no data is present in file. However after killing the running c code process, file has data present in it.

Here is the piece of code -

void writefile(){
  FILE *fp;
  fp = fopen("ABC.txt","w");
  fputs("Some lines...\n",fp);
  fclose(fp);

  system("code_B ABC.txt");
}

Please advise how can I read the file in the shell script without stopping the c code process.

Upvotes: 2

Views: 1723

Answers (3)

Andreas Fester
Andreas Fester

Reputation: 36649

The kernel ensures that data which is written to a file can be read back afterwards from a different process, even if it is not physically written to the disc yet. So, in usual scenarios, there is no need to call fsync() - still, even with fsync(), the filesystem could decide to further delay physical writes.

One common problem is that the C library has not flushed its buffers yet, in which case you would need to call fflush() - however, you are calling fclose() before launching your sub process, and fclose() internally calls fflush().

Actually, since system() is using a shell to launch the command passed as parameter, you can use the following simple SSCCE to verify that it works:

#include <stdio.h>

void writefile(){
  FILE *fp;

  fp = fopen("ABC.txt","w");
  fputs("Some lines...\n",fp);
  fclose(fp);

  system("cat ABC.txt");
}

int main() {
  writefile();
  return 0;
}

Here, system() simply calls the cat command to print the file contents. The output is:

$ ./writefile
Some lines...

Upvotes: 3

miluz
miluz

Reputation: 1423

You should do fsync() after the fclose(), to guarantee the writing of the file to the disk.

Take a look at this question:

Does Linux guarantee the contents of a file is flushed to disc after close()?

Upvotes: 3

Mark Harrison
Mark Harrison

Reputation: 304662

If there's some time between the fputs and fclose, add

fflush(fp);

This will cause the contents of the disk file to be written.

Upvotes: 3

Related Questions