Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 使用pwrite附加到文件_Unix_Atomic - Fatal编程技术网

Unix 使用pwrite附加到文件

Unix 使用pwrite附加到文件,unix,atomic,Unix,Atomic,我在学习UNIX编程时遇到了函数pwrite()。我读到了 pwrite(file_descriptor,buf,bufsize,offset); 将以下两项合并为一个原子操作: lseek(file_descriptor,offset,SEEK_SET); write(file_descriptor,buf,bufsize); 但是如果我需要附加到一个文件呢 如何找到对应于文件结尾的偏移量值 即使我找到所需的偏移量值并使用该值调用pwrite(),它也不会是一个原子操作(因为查找偏移量和调

我在学习UNIX编程时遇到了函数pwrite()。我读到了

pwrite(file_descriptor,buf,bufsize,offset);
将以下两项合并为一个原子操作:

lseek(file_descriptor,offset,SEEK_SET);
write(file_descriptor,buf,bufsize);
但是如果我需要附加到一个文件呢

  • 如何找到对应于文件结尾的偏移量值
  • 即使我找到所需的偏移量值并使用该值调用pwrite(),它也不会是一个原子操作(因为查找偏移量和调用pwrite()可能会被另一个进程中断)

  • 因此,我真正的问题是,如何使用pwrite()自动附加到文件?

    在符合要求的实现上,无法使用
    pwrite
    使其与
    O_append
    一起工作。在linux上
    pwrite
    忽略
    O_APPEND
    的偏移量:

    虫子

    POSIX要求打开带有O_APPEND标志的文件时 对pwrite()写入数据的位置没有影响。 但是,在Linux上,如果文件是用O_APPEND打开的,pwrite()会追加 无论偏移量的值是多少,都将数据保存到文件末尾


    您应该使用
    O_APPEND
    标志打开文件,并使用
    write
    对其进行写入。根据报告:

    如果设置了文件状态标志的O_APPEND标志,则应在每次写入之前将文件偏移量设置为文件的末尾,并且在更改文件偏移量和写入操作之间不应发生中间文件修改操作

    请注意,使用高级
    fwrite
    调用可能无法保证在seek和write之间不会发生文件修改