2014-12-03 4 views
0

그래서 mmap을 사용하여 다른 파일에 씁니다. 하지만 이상한 일은, 내 코드가 mmap에 부딪 칠 때 파일이 지워지는 것입니다. 그래서 임의의 문자 (AB, HAA, JAK 등)로 채워진 파일이 있습니다. 기본적으로 읽은 mmap을 사용하고 그 파일을 새 파일에 씁니다. 그래서 처음 if (argc == 3)는 정상적인 읽기 쓰기이고, 두 번째 if (argc == 4)는 mmap을 사용하기로되어 있습니다. 지구상에서 왜 이런 일이 일어나는 지 아는 사람이 있습니까?mmap은 파일을 복사하는 대신 내 파일을 닦습니다.

#include <stdio.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include <unistd.h> 
#include <sys/io.h> 
#include <sys/mman.h> 

#include <sys/time.h> 
#include <sys/resource.h> 


int main(int argc, char const *argv[]) 
{ 
    int nbyte = 512; 
    char buffer[nbyte]; 
    unsigned char *f; 
    int bytesRead = 0; 
    int size; 
    int totalBuffer; 
    struct stat s; 
    const char * file_name = argv[1]; 
    int fd = open (argv[1], O_RDONLY); 
    int i = 0; 
    char c; 

    int fileInput = open(argv[1], O_RDONLY); 
    int fileOutPut = open(argv[2], O_WRONLY | O_TRUNC | O_CREAT, S_IRUSR | S_IWUSR); 

    fstat(fileInput, &s); 
    size = s.st_size; 
    printf("%d\n", size); 
    if (argc == 3) 
    { 
     printf("size: %d\n", size); 
     printf("nbyte: %d\n", nbyte); 

     while (size - bytesRead >= nbyte) 
     { 
      read(fileInput, buffer, nbyte); 
      bytesRead += nbyte; 
      write(fileOutPut, buffer, nbyte); 
     } 

     read(fileInput, buffer, size - bytesRead); 
     write(fileOutPut, buffer, size - bytesRead); 
    } 

    else if (argc == 4) 
    { 
     int i = 0; 
     printf("4 arg\n"); 
     f = (char *) mmap (0, size, PROT_READ, MAP_PRIVATE, fileInput, 0); 
     /* This is where it is being wipped */ 
    } 

    close(fileInput); 
    close(fileOutPut); 

    int who = RUSAGE_SELF; 
    struct rusage usage; 
    int ret; 

    /* Get the status of the file and print some. Easy to do what "ls" does with fstat system call... */ 
    int status = fstat (fd, & s); 
    printf("File Size: %d bytes\n",s.st_size); 
    printf("Number of Links: %d\n",s.st_nlink); 

    return 0; 
} 

편집 : 난 당신이 mmap를 통해 그것을 할 때 처음 읽고 완벽하게 작품을 쓰기가 아니라 언급하고 싶었다.

+0

'argc == 4'일 때 출력 파일로 아무 것도하지 않습니다. 일어날 일이있을 것으로 예상됩니까? – duskwuff

+0

아니요, 파일 자체를보고 있습니다. 들어가기 전에 파일 (단어)의 크기는 ~ 3,0000입니다. 그 후, 크기는 0입니다. 나는 f의 첫 문자를 인쇄하려고 할 때 이상한 일이 벌어지고 있다는 것을 깨달았습니다. – Jen

+0

'f'를'MAP_FAILED'와 비교하여 검사하고, 실패하면'errno'를 출력 할 수 있습니까? 그게 실패에 대한 단서를 줘야 해. – JS1

답변

0

파일을 지우는 것이 확실하다면, 코드가 정확히 수행 할 것입니다.

잘라 내기로 대상을 열고 나서 argc==4 섹션에 입력 파일을 매핑하지만 데이터를 출력 파일로 전송할 절대적으로 아무것도 수행하지 않습니다.

당신은 argc==3 경우 유사한 몇 가지 설명의 while 루프를해야하지만, fileOutput 설명에 매핑 된 메모리에 바이트를 기록한다.

+0

아니요, 원본 파일이 지워집니다. ./mycp words words2 <- 단어를 지 웁니다. 예를 들어 f [0]을 인쇄하려고했을 때 오류가 발생했습니다. – Jen

+0

@Jen, 코드에서 반환 값을 확인하지 않는 경우가 많이 있습니다. 'mmap' 이후에'f'의 값은 무엇입니까? MAP_FAILED가 아닌지 확인하십시오. – paxdiablo

+0

그것은 실패했습니다, 그것이 문제입니다. 왜 그런지 모르겠습니다. – Jen