2012-03-19 2 views
2

낮은 수준의 I/O (읽기 (쓰기) 쓰기 만 허용하는 작업을하고 있습니다.), lseek())뿐만 아니라 perror().하위 수준의 CI/O : 한 파일에서 읽고 다른 파일에 쓸 때 무한 루프가 발생합니다.

올바른 권한으로 파일을 밖으로 및 밖으로 파일을 열 수 있었지만 내가 출력 할 때 파일 내용에 무한 루프가 나타납니다. 내 코드에서 트래핑 일부 오류를 제거하고 당신이 변수가 초기화 문가 포함되어 가정 할 수있다 ... 아래 니펫을

void *buf = malloc(1024); 
while((n = read(in, buf, 1024)) > 0){ 
    if(lseek(in, n, SEEK_CUR) == -1){ 
     perror("in file not seekable"); 
     exit(-1); 
    } 
    while((m = write(out, buf, n)) > 0){ 
     if(lseek(out, m, SEEK_CUR) == -1){ 
      perror("out file not seekable"); 
      exit(-1); 
     } 
    } 
    if(m == -1){ perror("error writing out"); exit(-1); } 
} 
if(n == -1){ perror("error reading in"); exit(-1); } 

를 참조하십시오.

+0

지금까지 어떤 디버깅을 했습니까? 예를 들어 어떤 루프가 바깥 루프 또는 내부 루프에 걸렸습니까? –

+1

당신이하고있는 일은 같은 줄을 반복적으로 쓰는 것이라고 생각합니다. 'while'을'if'에'write' 주위로 변경해보십시오. – twain249

+0

내부 루프에 걸렸습니다. 저쪽 너머에는 다른 것을 많이 말할 수 없습니다. – Dan

답변

2

문제는 내부 루프입니다. 당신은 또한 처리해야하는 즉 짧은 쓰기, 일 때 m와 쓰기 반환 < N & & m> 0

는 또한, lseek() 호출이 잘못하지만 루프로 연결되지 않습니다. read()write()은 이미 현재 파일 오프셋을 전진시킵니다. 입력 또는 출력 파일의 바이트를 건너 뛰고 싶지 않으면 수동으로 파일을 넘길 필요가 없습니다. 출력 파일의 경우 UNIX에서 바이트를 건너 뛰면 파일의 소위 "구멍"이 생길 수 있습니다. 0이지만 디스크 공간을 차지하지는 않음).

0

왜 읽은 후에 입력 파일을 찾으십니까? 최대 1024 바이트를 읽으므로 (은 0에서 1024 사이의 값을 갖게됩니다), 입력 파일 포인터를 놓은 곳을 벗어나 다른 곳을 계속 탐색하게되므로 데이터를 잃게됩니다. 전송 (당신이 끝날 때 파일의 끝을 넘어 아마도 포함).

수도 당신이 무한 루프하지만 훨씬 더 교활한 사람이 쓰기에 대한 while를 사용하는 것입니다을 왜 하나의 원인이 될 수. 성공하면 0보다 큰 값을 반환하므로 계속해서 첫 번째 청크를 파일에 계속 쓰게됩니다. 최소한 디스크 공간이나 다른 리소스가 부족할 때까지.

쓰기에도 seek이 필요하지 않습니다. readwrite 호출은 수행해야 할 작업을 수행합니다. read 또는 write의 파일 포인터를 올바르게 전진시킵니다. 수동으로 수행해야하는 것은 아닙니다.

당신은 아마 모든 일을 단순화 할 수 있습니다 :의 장점이있다

while ((n = read (in, buf, 1024)) > 0) { 
    if ((m = write (out, buf, n)) != n) { 
     perror ("error writing out"); 
     exit (-1); 
    } 
} 

:

  • seek 호출을 제거하기를,
  • '무한 루프'를 제거합니다.
  • 모두을 요청했는지 확인하십시오. 당신은 buf가 한 번 무한 많지 않은 시간을 기록 할

    if((m = write(out, buf, n)) > 0){ 
    

    while((m = write(out, buf, n)) > 0){ 
    

    정말해야한다 :

+2

SEEK_CUR의 whence 값이 주어지면 lseek가 파일의 현재 위치를 n만큼 증가시키지 않습니까? – Dan

+1

정확히 lseek() 호출이 루프를 일으키지 않는 이유는 생략 된 바이트 만 발생시키기 때문입니다. –