如何从FILE *写入fd?

时间:2019-03-06 13:35:20

标签: c file shared-libraries

我想将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));
}

1 个答案:

答案 0 :(得分:2)

您尝试的代码问题是指针算术问题。

  • fgetc返回作为值读取的字节,并将其存储到c中。到目前为止,一切都很好。
  • writefgetc更灵活-一次可以写入多个字节(类似于fread)。因此,您不能像尝试那样仅将其传递给单个整数值-它需要一个 pointer 指针到您要写入的字节的存储位置。 &cc所使用的内存的指针-但是,等等,还不是全部...
  • 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);
}