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