splice (man 2 splice)를 사용하여 데이터를 UDP 소켓에서 직접 파일로 복사하려고합니다. 아쉽게도 splice()에 대한 첫 번째 호출은 EINVAL을 반환합니다.EINVAL ("Invalid argument")를 반환하는 리눅스 splice()
남자 페이지 상태 :
EINVAL Target file system doesn't support splicing; target file is opened in
append mode; neither of the descriptors refers to a pipe; or offset
given for nonseekable device.
그러나, 나는 그 상태가 전혀 소용없는 생각합니다. 저는 Fedora 15 (kernel 2.6.40-4)를 사용하고 있으므로 splice()가 모든 파일 시스템에서 지원됩니다. 대상 파일은 splice에 대한 첫 번째 호출에서 관련성이 없어야하지만, 완성을 위해 open(path, O_CREAT | O_WRONLY | O_TRUNC, S_IRUSR | S_IWUSR)
을 통해 파일을 열었습니다. 두 호출 모두 파이프를 사용하며 어느 호출도 NULL 이외의 오프셋을 사용하지 않습니다.
int sz = splice(sock_fd, 0, mPipeFds[1], 0, 8192, SPLICE_F_MORE);
if (-1 == sz)
{
int err = errno;
LOG4CXX_ERROR(spLogger, "splice from: " << strerror(err));
return 0;
}
sz = splice(mPipeFds[0], 0, file_fd, 0, sz, SPLICE_F_MORE);
if (-1 == sz)
{
int err = errno;
LOG4CXX_ERROR(spLogger, "splice to: " << strerror(err));
}
return 0;
sock_fd는 다음과 같은 psuedocode에 의해 초기화됩니다 :
int sock_fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
setsockopt(sock_fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
fcntl(sock_fd, F_SETFL, flags | O_NONBLOCK);
bind(sock_fd, ...);
아마도 관련이 코드는 libevent 루프 내에서 실행된다는 점이다
여기 내 예제 코드입니다. libevent는 epoll()을 사용하여 UDP 소켓이 뜨겁다는 것을 확인합니다.
'sock_fd' 초기화가 끔찍한 것 같습니다. 반환 값을 확인하십시오! –
그건 그냥 psuedocode입니다. 실제 코드는 않습니다. 나는 약간의 텍스트를 명확히했다. –