2017-01-17 1 views
0

mmap()에 파일 설명자가 있지만 오류가 발생했습니다. 제가 확인한로mmap이 (가) '해당 파일 또는 디렉토리 없음'을 반환합니다.

LOG_BUFFER_SIZE은 500

printf("fcntl fd check: %d\n", fcntl(ss->fd_log, F_GETFD)); 
ss->log_mmap = mmap(NULL, LOG_BUFFER_SIZE, PROT_WRITE | PROT_WRITE, MAP_PRIVATE, ss->fd_log, 0); 

if (ss->data_mmap == NULL){ 
    printf("mmap() error: %s (errno=%d)\n", strerror(errno), errno); 
    exit(EXIT_FAILURE); 
} 

파일 기술자가 유효 다음과 같이 정의된다

access("../ss_data/SunLoadRight", F_OK) = -1 ENOENT (No such file or directory) 
open("../ss_data/log/SunLoadRight.log", O_RDWR|O_CREAT|O_APPEND|O_CLOEXEC, 0662) = 6 
fcntl(6, F_GETFD)      = 0x1 (flags FD_CLOEXEC) 
write(1, "fcntl fd check: 1\n", 18fcntl fd check: 1 
)  = 18 
mmap(NULL, 500, PROT_WRITE, MAP_PRIVATE, 6, 0) = 0x7f624c426000 
write(1, "mmap() error for fd #6: No such "..., 60mmap() error for fd #6: No such file or directory (errno=2) 
) = 60 
setitimer(ITIMER_PROF, {it_interval={0, 0}, it_value={0, 0}}, NULL) = 0 
rt_sigaction(SIGPROF, {SIG_DFL, [], SA_RESTORER, 0x7f624be704b0}, NULL, 8) = 0 
open("gmon.out", O_WRONLY|O_CREAT|O_TRUNC|O_NOFOLLOW, 0666) = 7 
write(7, "gmon\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 20) = 20 
writev(7, [{"\0", 1}, {"\320\[email protected]\0\0\0\0\0\354\[email protected]\0\0\0\0\0H7\0\0d\0\0\0seconds\0"..., 40}, {"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 28304}], 3) = 28345 
writev(7, [{"\1", 1}, {"\320*@\0\0\0\0\0$\[email protected]\0\0\0\0\0\1\0\0\0", 20}, {"\1", 1}, {"\300,@\0\0\0\0\0A\[email protected]\0\0\0\0\0\1\0\0\0", 20}, {"\1", 1}, {"\320,@\0\0\0\0\0\222\[email protected]\0\0\0\0\0\1\0\0\0", 20}, {"\1", 1}, {"\340,@\0\0\0\0\0n\[email protected]\0\0\0\0\0\1\0\0\0", 20}, {"\1", 1}, {"\360,@\0\0\0\0\0\341\[email protected]\0\0\0\0\0\1\0\0\0", 20}, {"\1", 1}, {"[email protected]\0\0\0\0\0\367\[email protected]\0\0\0\0\0\1\0\0\0", 20}, {"\1", 1}, {"\[email protected]\0\0\0\0\0>\[email protected]\0\0\0\0\0\1\0\0\0", 20}, {"\1", 1}, {"0/@\0\0\0\0\0\22\[email protected]\0\0\0\0\0\1\0\0\0", 20}, {"\1", 1}, {"[email protected]\0\0\0\0\0\37\[email protected]\0\0\0\0\0\1\0\0\0", 20}, {"\1", 1}, {"\[email protected]\0\0\0\0\0\232\[email protected]\0\0\0\0\0\1\0\0\0", 20}, {"\1", 1}, {"\320\[email protected]\0\0\0\0\0\246\[email protected]\0\0\0\0\0P\0\0\0", 20}, {"\1", 1}, {"0\[email protected]\0\0\0\0\0-\[email protected]\0\0\0\0\0P\0\0\0", 20}, {"\1", 1}, {"\220\[email protected]\0\0\0\0\0\22\[email protected]\0\0\0\0\0P\0\0\0", 20}, {"\1", 1}, {"\300\[email protected]\0\0\0\0\0-\[email protected]\0\0\0\0\0P\0\0\0", 20}, {"\1", 1}, {"\200\[email protected]\0\0\0\0\0\"\[email protected]\0\0\0\0\0\1\0\0\0", 20}, {"\1", 1}, {"\240\[email protected]\0\0\0\0\0\"\[email protected]\0\0\0\0\0\1\0\0\0", 20}, ...], 62) = 651 
close(7)        = 0 
exit_group(1)       = ? 
+++ exited with 1 +++ 

이는 다음과 같습니다

fcntl fd check: 1 
mmap() error for fd #6: No such file or directory (errno=2) 

이는 strace를하다 모든 새로운 것들이 나에게있어서, 아마 나는 어딘가에서 기본적인 실수를하고있을 것이다. 내가 추측하는 깃발이있는 것?

+1

'ss-> log_mmap'에 할당하면'ss-> data_mmap'을 검사하는 것이 의심 스럽습니다. 또한'PROT_WRITE | PROT_WRITE'? 또한 man 페이지가 실패한 경우 mmap의 반환 값에 대해 말하는 내용을 살펴보십시오. – Mat

+0

두 번째 출력 행이 두 번째'printf'와 일치하지 않습니다. fd # 6 "에 대한''어디서 왔는가? – mch

답변

0

ss->log_mmap을 설정하고 있지만 ss->data_mmap을 확인하십시오.

strace에서 mmap()이 유효한 포인터를 반환했습니다. 부정확 한 것이나 실패가있는 것처럼 보이지 않습니다. mmap()이 잘 작동했다고 의심됩니다. 또한 ENOENTmmap()에 대한 올바른 오류 코드가 아니므로 mmap()에서 오류가없는 경우 errno을 확인한 것 같습니다.

mmap()NULL이 아니라 MAP_FAILED을 반환합니다. 그들은 같은 가치가 없습니다.

개인 파일의 쓰기 매핑 만 매우 유용하지는 않습니다. 파일에 쓰지 않고 읽을 수없는 개인 메모리 영역에만 쓰고 다른 프로세스는 볼 수 없습니다. 쓰기가 파일로 갈 수 있도록 MAP_SHARED을 원할 수도 있습니다.

관련 문제