除了David Schwartz 回答中给出的序列之外,您也许可以将咨询锁与例如flock(2)系统调用一起使用(或者也许lockf(3)即fcntl(2)与F_SETLK
....)
这将意味着添加,就在
FILE * fil = fopen("/etc/routing_table.tmp", "wb");
线条
if (!fil)
{ perror("/etc/routing_table.tmp"); exit(EXIT_FAILURE); };
if (flock(fileno(fil), LOCK_EX))
{ perror("flock LOCK_EX"); exit(EXIT_FAILURE); };
最后,你会
if (fflush(fil)) /* flush the file before unlocking it!!*/
{ perror("fflush"); exit(EXIT_FAILURE); };
if (flock(fileno(fil), LOCK_UN))
{ perror("flock LOCK_UN"); exit(EXIT_FAILURE); };
if (fclose (fil))
{ perror("fclose"); exit(EXIT_FAILURE); };;
if (rename("/etc/routing_table.tmp", "/etc/routing_table"))
{ perror("rename"); exit(EXIT_FAILURE); };
使用这种咨询锁定将确保即使您的程序的两个进程正在运行,也只有一个进程会写入文件。
但这可能是矫枉过正。
顺便说一句,您似乎在/etc/
. 我相信这违反了习惯或约定(请参阅Linux Filesystem Hierarchy或Linux Standard Base)。我希望下面/etc
的文件是文本的。也许您希望您的文件在/var/lib
?
另请参阅在线高级 Linux 编程书籍。