0

アプリケーションから呼び出して、それらのものの一部を初期化する必要があるサードパーティのユーティリティがあります。popen標準入力にパスワードを書き込む必要があるため、使用して呼び出すことにしました。

私は単純なユースケースです:

...
FILE *f = popen("utility-bin", "w");
fwrite(myPassword.c_str(), 1, myPassword.size(), f);
fflush(f);
pclose(f);
...

ただし、どのように試しても、ストリームは送信されず、ユーティリティはパスワードを待っている間ブロックされたままです。

一方、通常の Linux シェルからユーティリティを呼び出すと、パスワードを入力するだけですべてが機能します。

私の質問は次のとおりです。アプリケーションがパイプからのデータをブロックしながら、通常のユーザー シェルからのデータを受け入れることは可能ですか? その場合、パイプ入力を受け入れるようにするためにできることはありますか?

PS: シェルからユーティリティを呼び出すと、多くのシグナルが処理されます。ctrl+cそしてctrl+z、たとえば、何もしません。

4

1 に答える 1

1

アプリケーションがパイプからのデータをブロックしながら、通常のユーザー シェルからのデータを受け入れることは可能ですか?

isatty入力が端末から来ているかどうかを伝える呼び出しを行うことができます。

その場合、パイプ入力を受け入れるようにするためにできることはありますか

方法はありますが、気に入らない場合があります。

  1. posix_openpt grantptと を使用して疑似端末を開きunlockptます。これで「マスター」fd が作成されました
  2. 新しいプロセスをフォークする
  3. 新しいプロセスを呼び出しsetsid()て、端末の関連付けを強制終了します
  4. ptsname手順 1 で取得した fdの子呼び出しで
  5. から取得した名前を開き、それptsnameを呼び出しますTIOCSTTY-制御端末になります
  6. 手順 5 で取得した記述子を複製してSTDIN_FILENO
  7. プログラムを実行する

おそらく、これに TLPIの関数を適応させるかptyForkpty_forkAPUEの関数を適応させることができます。

この時点で、プロセスからパイプのようにマスター fd に書き込むことができ、子プロセスはそれが端末からのものであると認識します。

于 2013-10-03T14:24:06.083 に答える