我怎样才能欺骗子进程的 isatty 检查?

How can I trick the isatty check of the child process?

父进程的代码如下:

#include <stdio.h>

int main() {
    char buffer[BUFSIZ];
    FILE *child = popen("./child", "r");
    size_t len = fread((void *) &buffer, BUFSIZ, 1, child);
    fprintf(stdout, "child message: %s", buffer);
    return 0;
}

这是子进程的代码:

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

int main() {
    fprintf(stdout, "%s\n", isatty(fileno(stdout)) ? "true": "false");
    return EXIT_SUCCESS;
}
$ gcc child.c -o child && gcc main.c -o main
$ ./main
child message: false

我想我不应该通过 popen 启动子进程,它不能骗过子进程的 isatty 检查。

我应该如何创建一个子进程以便我可以欺骗 isatty 检查?

您可以为您的进程分配一个 pty。这可以使用 script 实用程序方便地完成,默认情况下在许多平台上可用。此用法适用于 util-linux 版本:

#include <stdio.h>

int main() {
    char buffer[BUFSIZ];
    FILE *child = popen("script -qc ./child /dev/null", "r");
    size_t len = fread((void *) &buffer, BUFSIZ, 1, child);
    fprintf(stdout, "child message: %s", buffer);
    return 0;
}

macOS 将改为使用 script -q /dev/null ./child