C语言 是否可以使用“fopen”或“open”打开当前程序(argv[0])

kb5ga3dv  于 2023-03-01  发布在  其他
关注(0)|答案(1)|浏览(193)

我基本上是尝试使用fopen()创建一个指向当前文件(argv[0])的FILE指针,但它返回SegFault,我尝试打印错误并得到:文本文件忙碌。这是我得到的。显然错误在第14行if (localFile == NULL)

void copy(char *localFileName, char *targetFileName) {
    int ch;
    FILE *localFile = fopen(localFileName, "r+b");
    FILE *targetFile = fopen(targetFileName, "r+b");
    FILE *tempFile = fopen("tempFile.bin", "wb+");
    if (tempFile == NULL) {
        perror("tempFile");
    }

    if (targetFile == NULL) {
        perror("targetFile");
    }

    if (localFile == NULL) {
        perror("localFile");
    }
    while((ch = fgetc(localFile)) != EOF) { 
        fputc(ch, tempFile);
    }
    while ((ch = fgetc(targetFile)) != EOF) {
        fputc(ch, tempFile);
    }
    fclose(localFile);
    fclose(targetFile);
}
iovurdzv

iovurdzv1#

是的,这是可能的,但你应该意识到一些事情可能会使它变得困难:-)

  • 不能保证argv[0]会被设置为正在运行的程序的 * 实际 * 文件名。该标准只声明,在信息完全可用的情况下,它“表示程序名”。“表示”允许“prog”,“/full/path/to/prog”,“./relative/path/to/prog”,或者甚至是“位于应用程序目录中的prog程序”。所提供的是非常 * 非常 * 依赖于实现的(procfs文件系统,如果可用的话,可能会提供更好的信息,比如来自/proc/self/exe)。
  • 由于各种限制,无法保证您能够打开它。例如,在现代环境中,您不太可能以包含更新访问的模式之一打开它,因为它可能被用作后备存储,用于将可执行文件的部分分页进出主内存。
  • 即使不是这种情况,您也可以将access配置为能够执行程序但不能读取它们(--x模式),在这种情况下,即使分页系统没有锁定文件,您也无法打开文件进行阅读。

相关问题