lseek에 대한 O_APPEND의 동작은 무엇입니까? O_APPEND에서 열린 파일을 덮어쓸 수 있습니까?

lseek에 대한 O_APPEND의 동작은 무엇입니까? O_APPEND에서 열린 파일을 덮어쓸 수 있습니까?

문서에 man lseek따르면,

O_APPEND열린 파일 설명에 파일 상태 플래그가 설정된 경우 는 write(2)여부에 관계없이 항상 파일 오프셋을 파일 끝으로 이동합니다 lseek().

파일 오프셋이 호출 전이나 후에 끝으로 이동되는지는 알려주지 않습니다 write(2).

파일 이 열려 있는 동안 맨 위로 O_APPEND이동하여 파일을 다시 쓸 수 있습니까 lseek?

답변1

파일 이 열려 있는 동안 맨 위로 O_APPEND이동하여 파일을 다시 쓸 수 있습니까 lseek?

아니요.

~에 따르면POSIX 문서write():

파일 상태 플래그의 O_APPEND 플래그가 설정된 경우 각 쓰기 전에 파일 오프셋을 파일 끝으로 설정해야 하며, 파일 오프셋 변경과 쓰기 작업 사이에 중간 파일 수정 작업이 발생해서는 안 됩니다.

할 수 있는그러나 다음을 사용하십시오 pwrite().

이 함수는 지정된 위치에 쓰고 파일 오프셋( 설정 여부에 관계없이) 을 변경하지 않는다는 점을 제외 pwrite()하고 와 동일해야 합니다 . 의 처음 세 인수는 파일 내의 원하는 위치에 오프셋을 추가하는 네 번째 인수와 동일합니다 . ...write()O_APPENDpwrite()write()

오프셋을 직접 관리하면 됩니다.

안타깝게도,pwrite()Linux에서 깨짐:

POSIX에서는 O_APPEND이 플래그를 사용하여 파일을 열 때 pwrite()데이터가 기록되는 위치에 영향을 주지 않아야 합니다. 그러나 Linux에서는 를 사용하여 파일을 열면 O_APPENDpwrite() 값에 관계없이 데이터가 파일 끝에 추가됩니다 offset.

따라서 Linux에서는 이를 다시 작성할 수 있는 방법이 없습니다 O_APPEND.

답변2

아니요, 이 파일을 다시 쓸 수 없습니다. 각 파일을 실행하기 전에 write파일 오프셋을 끝으로 설정하십시오.

관련 정보