đây là một câu hỏi khác về mối nối(). Tôi hy vọng sẽ sử dụng nó để sao chép các tập tin, và đang cố gắng sử dụng hai cuộc gọi ghép nối với nhau bằng một đường ống giống như ví dụ trên trang Wikipedia của mối nối. Tôi đã viết một trường hợp thử nghiệm đơn giản mà chỉ cố gắng đọc 32K byte đầu tiên từ một tập tin và viết chúng vào một:Làm cách nào để sử dụng chức năng ghép nối() của Linux để sao chép tệp sang một tệp khác?
#define _GNU_SOURCE
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
int main(int argc, char **argv) {
int pipefd[2];
int result;
FILE *in_file;
FILE *out_file;
result = pipe(pipefd);
in_file = fopen(argv[1], "rb");
out_file = fopen(argv[2], "wb");
result = splice(fileno(in_file), 0, pipefd[1], NULL, 32768, SPLICE_F_MORE | SPLICE_F_MOVE);
printf("%d\n", result);
result = splice(pipefd[0], NULL, fileno(out_file), 0, 32768, SPLICE_F_MORE | SPLICE_F_MOVE);
printf("%d\n", result);
if (result == -1)
printf("%d - %s\n", errno, strerror(errno));
close(pipefd[0]);
close(pipefd[1]);
fclose(in_file);
fclose(out_file);
return 0;
}
Khi tôi chạy này, các tập tin đầu vào dường như được đọc đúng, nhưng các cuộc gọi nối thứ hai thất bại với EINVAL. Có ai biết tôi đang làm gì sai ở đây không?
Cảm ơn!
Đối với bất kỳ ai đọc điều này, lệnh gọi 'splice' thứ hai chỉ nên đọc số byte từ đường ống khi lệnh gọi' splice' đầu tiên được trả về. Vào các ngày của Linux, kích thước ống mặc định là '65535'. – Jite