用C覆盖文件的内容

时间:2017-03-17 18:07:46

标签: c file

我正在编写一个可以分解多个进程的代码。它们共享一个名为“character”的文件。我想要做的是让每个进程读取文件中的“唯一字符”然后通过放置自己的字符来擦除它,以便其他进程可以执行相同的操作。该文件是进程可以相互通信的唯一方式。如何删除文件中的“唯一字符”并在其中放置一个新字符。我建议使用freopen()(关闭文件并重新打开它删除其先前的内容)但我不确定它是否是实现此目的的最佳方法。

1 个答案:

答案 0 :(得分:1)

您不必重新打开该文件。这没有任何好处。如果您担心每个进程缓冲输入或输出,如果要使用基于FILE *的stdio函数,请禁用缓冲。

但是,如果我正确地阅读你的问题(你希望每个进程在文件中保存特定值时替换文件中的一个字符,并且每个进程的值都会更改),这将为您做什么想要使用POSIX open() pread()pwrite()(你已经在使用POSIX fork()了,所以使用低级POSIX IO会让事情变得更简单 - 请注意{ {1}}和pread()消除了寻求的必要性。)

我会说这是我想的你想要做的事情:

pwrite()

对于任何相当数量的进程,这会给你的文件系统带来很大的压力。

如果您真的想从// header files and complete error checking is omitted for clarity int fd = open( filename, O_RDWR ); // fork() here? // loop until we read the char we want from the file for ( ;; ) { char data; ssize_t result = pread( fd, &data, sizeof( data ), 0 ); // pread failed if ( result != sizeof( data ) ) { break; } // if data read matches this process's value, replace the value // (replace 'a' with 'b', 'c', 'z' or '*' - whatever value you // want the current process to wait for) if ( data == 'a' ) { data = 'b'; result = pwrite( fd, &data, sizeof( data ), 0 ); break; } } close( fd ); 开始并使用该系列调用,则此可能会根据您的实现工作:

fopen()

同样,这假设我正在正确地阅读你的问题。请注意,John Bollinger在他关于多个句柄的注释中提到的POSIX规则不适用 - 因为流明确没有缓冲。