如何使用 fopen 和 fwrite 写入新的 Mac binary/executable?

How to write to a new Mac binary/executable using fopen and fwrite?

我正在尝试通过 TCP 连接传输文件,我注意到 Mac 上的 binary/executable 文件没有文件扩展名。从现有的二进制文件中读取时这似乎不是问题,但是当尝试写入新文件时,它会创建一个没有扩展名的空白文件 - 什么都没有。我怎样才能解决这个问题?这是代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(){
    char* filename = "helloworld";
    FILE* file = fopen(filename, "rb");
    FILE* writefile = fopen("test", "wb");
    fseek(file, 0, SEEK_END);
    unsigned int size = ftell(file);
    printf("Size of %s is: %d bytes\n", filename, size);
    fseek(file, 0, SEEK_SET);
    char* line = (char *) malloc(size+1);
    fread(line, size, 1, file);
    fwrite(line, size, 1, writefile);
    free(line);
    fclose(writefile);
    fclose(file);
    return 0;
}

helloworld 是我正在读取的现有可执行文件(正在运行),我正在尝试写入一个名为 test

的新可执行文件

您的代码看起来不错(忽略缺少错误检查)。复制完成后,您需要添加 x(可执行)权限。

在终端中,您可以输入 chmod +x test

来自程序内部:

#include <sys/types.h>
#include <sys/stat.h>

...

    fclose(writefile);
    fclose(file);
    chmod("test", S_IRWXU);
    return 0;
}

这是XY问题的一个例子。你说这是关于编写文件并命名它但你真正的问题是你无法执行输出文件。后者才是真正的问题。您可以通过使用 diff 比较两个文件来避免考虑 X。那会鼓励您考虑元 Y 的可能性(即权限)。

如果您的代码在输入文件上执行 stat,那么它可以为输出文件执行 chmodutime 等元函数,给定来自 stat 的值结构。

例如,如果您的代码包含以下内容:

struct stat stat_filename; /* filename is an unsuitable name for such a variable */
if (stat(filename, &stat_filename)) {
    perror("cannot stat input file");
    exit(1);
}

然后在你写完输出文件后,你可以这样做:

if (chmod("test", stat_filename.st_mode)) { /* need variable to hold output filename */
    perror("cannot chmod output file");
    exit(1);
}

如果这样做,输出文件将更接近输入文件的 "mirror" 副本。