是否可以向 popen() 传递一个字符串并使其 return 为空?

Is it possible to pass popen() a string and have it return null?

在处理 line/branch 单元测试的覆盖率时,我遇到了以下代码

bool run_command(char *command)
{
    FILE *handle = popen(command, "r");
    if (handle == nullptr)
    {
        std::cerr << "" << std::endl;
        return false;
    }

我尝试了很多不同的命令,例如

"cat /dev/null | head"

但似乎没有什么会导致 popen 失败。我还写了一个Python脚本,test.py,

for i in range(10000):
    print(i)

并将“python test.py | head”传递给 popen()。这会导致“管道损坏”错误,但 popen 仍然是 return 一个有效地址。

是否可以将命令字符串传递给 popen 函数,使其 return 为空?

我不这么认为。 glibc's popen ultimately calls posix_spawn,它的文档说它只有在 fork() 失败时才会失败。这与文件名无关。

同样,popen 在调用 posix_spawn 之前还有其他一些方法可能会失败,但它们与文件名无关;只有 运行 内存或文件描述符不足的情况。