1

パイプとフォークを使用して、次のようなコマンドを実行しています

猫ファイル.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 は返されません。

ttyでbashを呼び出すにはどうすればよいですか?

ありがとう

4

1 に答える 1

1

あなたの懸念は、あなたが起動するコマンドがstdinその親 ( myprogram)から継承し、その親stdinが からデータを受け取るパイプであることだと思いますcat file.tar.gzstdin継承されたパイプではなく、tty からデータを読み取るように強制された子プロセスを実行したいと考えています。

を開い/dev/ttyて tty への参照を取得できます。tty がないと失敗します。例えば:

close(0);
open("/dev/tty", O_RDWR);
/* The file descriptor returned by open should be 0 */

stdoutただし、子コマンドをプログラムへのパイプにリダイレクトしていることに気付きました。実行中のコマンドexecが対話型の場合、これは機能しません。対話型コマンドでは、入力と出力の両方を tty に接続する必要があります。stdinttyに接続しているかどうかに関係なく、出力がパイプに接続された状態で対話型コマンドを起動しても、おそらく意味がありません。

ところで、なぜbash -c <command>の代わりにを使用sh -c <command>するのexeclpですか? bashこのようにして、本当に必要なのは標準の POSIX bourne シェルだけであるという不必要な依存関係を導入しますshexecing throughsh -cは、シェルからコマンドを起動する標準的な方法です。これは、たとえば によって行われsystem()ます。

于 2012-05-14T16:04:37.387 に答える