2010-04-05 3 views
5

splice 시스템 호출을 시험해보고 싶었습니다. 나는이 기능을 가지고 - 그것은 또 다른 하나 개의 파일의 내용을 복사해야합니다 :linux splice()를 호출 할 때 잘못된 인수가 있습니다.

static void test_splice(int in, int out) { 

     int i = 0, rcvd = 0; 
     int filedes[2]; 
     off_t off = 0; 

     if (pipe(filedes) < 0) { 
       perror("Kicha pipe"); 
       exit(EXIT_FAILURE); 
     } 

     for (i = 0; i < NUMLOOPS; ++i) { 

       if ((rcvd = splice(in, NULL, filedes[1], NULL, BUFSIZE, SPLICE_F_MORE | SPLICE_F_MOVE)) < 0) { 
         perror("splice"); 
         exit(EXIT_FAILURE); 
       } 

       if (splice(filedes[0], NULL, out, NULL, rcvd, SPLICE_F_MORE | SPLICE_F_MOVE) < 0) { 
         perror("splice"); 
         exit(EXIT_FAILURE); 
       } 
     } 
} 

첫 번째 반복에 잇기 두 번째 호출은 (perror는에서 잘못된 인수) 매번 EINVAL을 반환 - 어떤 이유가 될 수 있을까?

+0

파일은 어떤 종류의 파일 시스템입니까? – Duck

+0

둘 다 ext3이지만, 나는 또한/dev/zero에서 읽기를 시도하고/dev/null에 같은 오류를 썼다. –

+4

방금 ​​해결했습니다 - "a +"모드로 fopen을 사용하여 파일을 열었습니다 - "w"로 변경하면 효과가있었습니다. –

답변

-1

나는이이 일을하는 가장 좋은 방법인지 모르겠지만, 이것은 나를 위해 작동 : 그것은 하나 개의 스레드를 생성

http://vectrex.org.uk/mark/splicecopy.cpp

읽기 및 쓰기에 대한 또 다른 수 있습니다. 이것은 불필요 할 수 있습니다. 쓰기 스레드는 하나의 splice() 호출 만 필요로하는 것처럼 보이지만 독자는 내 시스템에서 약 64k마다 수행합니다.

위의 내용은 Fedora 13 x86_64에서 테스트되었으며 larg (ish) 파일을 복사 할 수있는 것으로 보입니다. splice(2)에서

1

:

ERRORS 
     ...  
     EINVAL Target filesystem doesn't support splicing; target file is 
       opened in append mode; neither of the file descriptors refers to 
       a pipe; or offset given for nonseekable device. 
     ...  

영업 이익의 발언은 그가 추가 모드에서 파일을 열 것으로 나타났다.