我想将FILE*
文件(*.so
库)的内容复制到文件描述符中,该文件描述符将提供给其他功能。我已阅读过fileno()
,但似乎无法正常使用。
有人可以给我一个窍门吗?
这是我的代码:
int takeFromDisk(char *file){
int shm_fd;
shm_fd = open_ramfs(); // Give me a file descriptor to memory
printf("[+] File Descriptor Shared Memory created!\n");
FILE *fichier = fopen(file, "r");
fclose(fichier);
return(shm_fd);
}
还有我用来获取文件描述符的函数:
int open_ramfs(void) {
int shm_fd;
//If we have a kernel < 3.17
// We need to use the less fancy way
if (kernel_version() == 0) {
shm_fd = shm_open(SHM_NAME, O_RDWR | O_CREAT, S_IRWXU);
if (shm_fd < 0) { //Something went wrong :(
fprintf(stderr, "[-] Could not open file descriptor\n");
exit(-1);
}
}
// If we have a kernel >= 3.17
// We can use the funky style
else {
shm_fd = memfd_create(SHM_NAME, 1);
if (shm_fd < 0) { //Something went wrong :(
fprintf(stderr, "[- Could not open file descriptor\n");
exit(-1);
}
}
return shm_fd;
}
我尝试过的代码:
int c;
while ((c = fgetc(fichier)) != EOF)
{
write(shm_fd, &c, sizeof(c));
}
答案 0 :(得分:2)
您尝试的代码问题是指针算术问题。
fgetc
返回作为值读取的字节,并将其存储到c
中。到目前为止,一切都很好。write
比fgetc
更灵活-一次可以写入多个字节(类似于fread
)。因此,您不能像尝试那样仅将其传递给单个整数值-它需要一个 pointer 指针到您要写入的字节的存储位置。 &c
是c
所使用的内存的指针-但是,等等,还不是全部... fgetc
返回其在int
中读取的字节。在所有现代平台上,int
大于一个字节,因此变量c
实际上大于一个字节(您将遇到的大多数系统在一个int
,这也是您的sizeof
会产生的结果,因此您最终得到的文件会膨胀4倍。不幸的是,平台的不同之处在于,您在乎的那个字节正是在该变量的内存中找到的。在许多平台上,使用&c
可以使用,但不能在所有平台上使用。fread
读取它,然后使用write
将其写入另一个FD,大约是这样(我省去了错误处理和其他详细信息):#define BUFSIZE 4096
char buf[BUFSIZE];
while (1) {
size_t num_read = fread(&buf, 1, BUFSIZE, fichier);
if (num_read == 0) break;
write(shm_fd, &buf, num_read);
}