Linux: добавление содержимого в файл с помощью нескольких процессов и 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, "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;
}

person Luis Andrés García    schedule 01.08.2013    source источник
comment
Посмотрите на O_CREAT и O_EXCL для вашего open звонка.   -  person Duck    schedule 01.08.2013
comment
Но создание с O_EXCL не является атомарным с NFS см. Это и это   -  person Luis Andrés García    schedule 02.08.2013
comment
В вашем вопросе указано, что если файл не существует, его следует создать. Этого не произойдет без O_CREAT или creat() в любой файловой системе. В этом сценарии ваш open выходит из строя, и вы продолжаете полностью отказываться от ошибок, так что ничего не записывается. (Также open возвращает дескриптор файла, который является целым числом. Size_t - беззнаковый тип.)   -  person Duck    schedule 02.08.2013