Linux:使用多个进程和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,

我在向文件添加信息时遇到了一个问题,即使用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, "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是一个无符号类型。)