无法写入 Linux 中的管道
Unable to write to a pipe in Linux
我有一个第三方实用程序,我必须从我的应用程序中调用它来初始化他们的一些东西。我选择使用 popen
调用它,因为我需要向 stdin(标准(写入密码。
我是一个简单的用例:
...
FILE *f = popen("utility-bin", "w");
fwrite(myPassword.c_str(), 1, myPassword.size(), f);
fflush(f);
pclose(f);
...
但是,无论我如何尝试,流都不会发送,并且实用程序仍然被阻止等待密码。
另一方面,如果我从常规的 Linux shell 调用该实用程序,我只需输入密码即可一切正常。
所以我的问题是:应用程序是否有可能阻止来自管道的数据,但仍接受来自普通用户 shell 的数据?而且,如果是这种情况,我能做些什么来让它接受我的管道输入?
PS:当我从外壳调用实用程序时,许多信号都在处理中。 例如,ctrl+c
和ctrl+z
什么都不做。
应用程序是否可以阻止数据来自 管道,但仍接受来自普通用户外壳
它可以调用isatty
,这将告诉它输入是否来自终端。
如果是这样的话,我能做些什么来让它接受我的 管道输入
有一种方法,但您可能不喜欢它:
- 使用
posix_openpt
grantpt
和unlockpt
打开伪终端。您现在拥有"大师"FD - 分叉新流程
- 在新进程中调用
setsid()
以终止其终端关联 - 在步骤 1 中获得的 fd 上的子呼叫
ptsname
- 打开从
ptsname
获得的名称并在其上调用TIOCSTTY
- 它成为控制终端 - 将步骤 5 中获得的描述符复制到
STDIN_FILENO
- 执行您的程序
您可能可以为此调整TLPI的功能ptyFork
或APUE的功能pty_fork
。
此时,您可以从您的过程中写入主fd - 就好像它是管道一样,孩子会认为它来自终端。
相关文章:
- 在 Azure DevOps 构建管道中使用英特尔C++编译器为 Linux 环境构建C++代码
- GSTREAMER管道播放,但没有填充的回调(仅在Android上发生,在Windows和Linux上可行)
- 如何在 Linux C++ 应用程序中通过管道传输到 ifstream
- 递归执行C 中的Linux管道命令
- 为什么这里的程序体现在Linux中命名的管道的使用情况会遭受种族条件
- 从 Linux 中的多个非阻塞命名管道读取
- 命名管道linux
- Linux 标准输出管道问题
- 无法使用 istream 和 ostream 指针跨 Linux 管道写入
- 在 Linux C++的两个线程之间使用管道的错误/意外行为
- 从 Linux 中的管道/套接字读取所有结构或什么都没有
- 无法写入 Linux 中的管道
- 为什么Linux中的管道会丢失空间
- 每次我在linux c++中为命名管道运行程序时,都会发出SIGSTOP信号
- 在linux中使用命名管道的简单客户端/服务器程序
- 数据报管道在Linux中可能吗?
- 命名管道在c++ Linux检查缓冲区是否已满
- 如何在Linux上的c++中将数据管道到bzip2中并从其标准输出中获得结果数据?
- Linux.Python.从命名管道中读取
- 通过管道/内部linux套接字实现RPC的任何开源C/ c++库/框架