У меня проблема при добавлении информации в файл, к файлу одновременно обращаются несколько машин с использованием файловой системы 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;
}
open
звонка. - person Duck   schedule 01.08.2013creat()
в любой файловой системе. В этом сценарии вашopen
выходит из строя, и вы продолжаете полностью отказываться от ошибок, так что ничего не записывается. (Такжеopen
возвращает дескриптор файла, который является целым числом. Size_t - беззнаковый тип.) - person Duck   schedule 02.08.2013