2

我有用于 ajax 源的文本文件。每 1 秒浏览器发送 ajax 请求以从该文件中读取实际数据。我还在 C 上编写了守护程序,它将实际数据写入该文件。看下面的代码:

static void writeToFile_withLock(const char * file_path, const char * str)
{
    struct flock fl = {F_WRLCK, SEEK_SET,   0,      0,     0 };
    int fd;
    const char * begin = str;
    const char * const end = begin + strlen(str);

    fl.l_pid = getpid();

    if ((fd = open(file_path, O_CREAT | O_WRONLY)) == -1) {
        perror("open");
        exit(1);
    }
    printf("Trying to get lock...\n");
    if (fcntl(fd, F_SETLKW, &fl) == -1) {
        perror("fcntl");
        exit(1);
    }
    printf("got lock\n");

    printf("Try to write %s\n", str); 
    while (begin < end)
    {
        size_t remaining = end - begin;
        ssize_t res = write(fd, begin, remaining);
        if (res >= 0)
        {
            begin += res;
            continue; // Let's send the remaining part of this message
        }
        if (EINTR == errno)
        {
            continue; // It's just a signal, try again
        }
        // It's a real error
        perror("Write to file");
        break;
    }

    fl.l_type = F_UNLCK;  /* set to unlock same region */

    if (fcntl(fd, F_SETLK, &fl) == -1) {
        perror("fcntl");
        exit(1);
    }

    printf("Unlocked.\n");

    close(fd);

}

问题:如果以前的数据 > 新数据,那么旧的几个符号会保留在文件的末尾。

如何重写完整的文件内容?

提前致谢。

4

2 回答 2

3

将 O_TRUNC 添加到 open() 调用...

O_TRUNC

如果文件已经存在并且是常规文件并且打开​​模式允许写入(即 O_RDWR 或 O_WRONLY),它将被截断为长度 0。如果文件是 FIFO 或终端设备文件,则忽略 O_TRUNC 标志。否则,未指定 O_TRUNC 的效果。

于 2013-03-22T16:38:07.793 回答
0

你基本上有两个选择。设置O_TRUNC第二个参数的位以open在打开文件时丢弃所有内容,或者ftruncate在完成时调用以丢弃不需要的文件内容。(或使用truncate,但由于您已经有一个打开的文件描述符,这样做没有任何好处。)

于 2013-03-22T16:47:33.053 回答