Linux:使用多个进程和NFS将内容附加到文件中
我在向文件添加信息时遇到了一个问题,即使用NFS文件系统,多台计算机同时访问一个文件。我结合了该功能的功能:Linux:使用多个进程和NFS将内容附加到文件中,linux,multithreading,file,locking,nfs,Linux,Multithreading,File,Locking,Nfs,我在向文件添加信息时遇到了一个问题,即使用NFS文件系统,多台计算机同时访问一个文件。我结合了该功能的功能: open(nameFile.c_str(), O_WRONLY | O_APPEND); 从fcntl.h(请参阅),以及进程尝试使用文件时对文件的锁定: size_t filedesc = open(nameFile.c_str(), O_WRONLY | O_APPEND); if (filedesc != -1) { fp = fdopen(filedesc,
open(nameFile.c_str(), O_WRONLY | O_APPEND);
从fcntl.h
(请参阅),以及进程尝试使用文件时对文件的锁定:
size_t filedesc = open(nameFile.c_str(), O_WRONLY | O_APPEND);
if (filedesc != -1)
{
fp = fdopen(filedesc, "a");
}
if(fp != NULL)
{
//Initialize the flock structure.
struct flock lock;
memset (&lock, 0, sizeof(lock));
lock.l_type = F_WRLCK;
//Locking file
fcntl (filedesc, F_SETLKW, &lock);
//Writing log message
fputs((sMessage+ string("\n")).c_str(),fp);
//Unlocking log file
lock.l_type = F_UNLCK;
fcntl (filedesc, F_SETLKW, &lock);
//Close file
fclose(fp);
}
我的问题是:
如果文件不存在,则应创建该文件(如上所述)。但是,该文件未创建,因此要写入其中的内容将丢失
我做错了什么
谢谢
编辑:
例如:
#include <string>
#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <fcntl.h>
#include <string.h>
using namespace std;
static void writeToFile()
{
string nameFile = string("filename.txt");
FILE *fp=NULL;
size_t filedesc = open(nameFile.c_str(), O_WRONLY | O_APPEND);
if (filedesc != -1)
{
fp = fdopen(filedesc, "a");
}else{
perror("Unable to open file");
}
if(fp != NULL)
{
//Initialize the flock structure.
struct flock lock;
memset (&lock, 0, sizeof(lock));
lock.l_type = F_WRLCK;
//Locking file
fcntl (filedesc, F_SETLKW, &lock);
//Writing log message
fputs((string("message")).c_str(),fp);
//Unlocking log file
lock.l_type = F_UNLCK;
fcntl (filedesc, F_SETLKW, &lock);
//Close file
fclose(fp);
}else{
perror("fdopen failed");
}
}
int main()
{
string inputString(" ");
writeToFile();
return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
静态void writeToFile()
{
string nameFile=string(“filename.txt”);
FILE*fp=NULL;
size_t filedesc=open(nameFile.c_str(),O_WRONLY | O_APPEND);
如果(filedesc!=-1)
{
fp=fdopen(filedesc,“a”);
}否则{
perror(“无法打开文件”);
}
如果(fp!=NULL)
{
//初始化flock结构。
结构植绒锁;
memset(&lock,0,sizeof(lock));
lock.l_type=F_WRLCK;
//锁定文件
fcntl(文件描述、F_设置和锁定);
//写入日志消息
fputs((字符串(“消息”)).c_str(),fp);
//解锁日志文件
lock.l_type=F_unck;
fcntl(文件描述、F_设置和锁定);
//关闭文件
fclose(fp);
}否则{
perror(“fdopen失败”);
}
}
int main()
{
字符串输入字符串(“”);
writeToFile();
返回0;
}
查看O_create和O_EXCL,了解您的open
调用。但是,使用O_EXCL创建的文件在NFS中不是原子的,您的问题指出,如果文件不存在,则应创建该文件。在任何文件系统上,如果没有创建或CREAT()
,这种情况都不会发生。在这种情况下,open
会失败,并且会一直出错,因此不会写入任何内容。(同时open
返回一个文件描述符,它是一个整数。size\t是一个无符号类型。)