我正在使用一些管道和 fork 来执行类似的命令
猫file.tar.gz | myprogram -c“tar -zvt” -i“remoteMachineIp”
但是如果我这样做
myprogram -c“bash” -i“remoteMachineIp”
bash还可以,但是没有tty。
没有tty,如果我调用vim命令,它将打开vi困惑的状态。
我如何用tty在execlp上调用bash。
程式码范例
if(cm->pid2==0){ //pipe and fork to send data to my execlp
close(cm->fout[0]);
dup2(cm->fout[1], 1);
execlp("bash", "bash", "-c", command.c_str(), NULL); // command is mycommand so is bash -c "bash"
}
else{
close(cm->fout[1]);
while((size=read(cm->fout[0], buffer, 2000)) > 0){
cm->message->send(buffer, size); //send the data to my program
}
//Close it and send the return code
问题是execlp将bash返回给我,但是没有tty
如果我将ssh user @ machine称为“bash”,bash会出现问题,但将ssh user @ machine突出显示就可以了
我如何用tty叫bash?
谢谢
最佳答案
我猜您担心的是,您启动的命令从其父级(stdin
)继承了myprogram
,而其父级的stdin
是从cat file.tar.gz
接受数据的管道。您想运行一个强制从tty而不是继承的stdin
管道读取数据的子级。
您可以打开/dev/tty
以获得对tty的引用。如果没有tty,它将失败。例如:
close(0);
open("/dev/tty", O_RDWR);
/* The file descriptor returned by open should be 0 */
但是,我注意到您将子命令的
stdout
重定向到程序的管道。如果您正在exec
进行编码的命令是交互式的,则此命令将无效。交互式命令需要将其输入和输出都连接到tty。不管是否将stdin
连接到tty,启动一个交互式命令并将其输出连接到管道都可能没有任何意义。顺便说一句:为什么您在
bash -c <command>
中使用sh -c <command>
而不是execlp
?这样,您引入了对bash
的不必要依赖,而您真正需要的只是标准POSIX bourne shell sh
。通过exec
进行sh -c
编码是通过shell启动命令的标准方法。例如,这就是通过system()
完成的。关于c++ - 不带TTY的Execlp通话 bash ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10585878/