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

基本的に 2 つのオプションがあります。ファイルを開くときにすべてのコンテンツを破棄するようO_TRUNCに の 2 番目のパラメーターのビットを設定するか、不要なファイルのコンテンツを破棄するために終了時に呼び出します。(または を使用しますが、既に開いているファイル記述子があるため、それを行う利点はありません。)openftruncatetruncate

于 2013-03-22T16:47:33.053 に答える