4

Cでopenptyを使用してptyを作成し、マスター/親とスレーブ/子の間で共有しています。子はfork/execを実行し、ファイル記述子を他のプログラムに渡すことができます。子供にコマンドを注入したいのですが、すぐに渡すと迷子になります。親プロセスから、誰かがstdinからの入力をブロックしていることをどのように知ることができますか?私はたまたまSUSE10に取り組んでいますが、ディストリビューションに依存しないソリューションを好みます。

編集:この質問への答えはまだ私には興味深いですが、問題に関連していない可能性があります。後で説明します。

コードの簡略化されたバージョンは、スクリプトのソースコードを使用し(ヘッダーの一部を修正する必要がある場合があります)、行を追加することです。

char* command = "echo 'Hello World!'\r\n", written = 0;
(void)write(master, command, strlen(command));
(void)write(STDOUT_FILENO, "Sent command\r\n", 14);

ビッグの前に

for (;;) {

主に。

スクリプトからcshを実行していましたが、スクリプトコマンドがガベージをダンプしていることに気付きました(viで表示)。

^[[>0;115;0c

親のstdinに。代わりにbashシェルを実行すると、何もダンプされず、プログラムはコマンドを正常に挿入します。

質問に対する答えについてはまだ興味がありますが、他に何かが起こっているため、明らかに私の問題とは関係がありません。ptyが読み取られているかどうかを確認する方法を誰かが知っている場合は、遠慮なく答えてください。

4

2 に答える 2

1

私の知る限り、ファイル記述子は別のプロセスへの移動に耐えられません。ただし、スレッド間でそれらを共有することはできます。

いつ読み取るべきかを知ることに関してはselect、読み取りセット内の適切なファイル記述子を使用してみます。

于 2012-07-31T11:23:42.657 に答える
0

マスター fd への書き込み時に、データが失われるという同じ問題に気付きました。

書き込みにスレーブ fd を使用することで問題を回避できます。そして、子の stdin のマスター fd。こちらです:

int main(void)
{
    int master_fd = -1;
    int slave_fd  = -1;

    if( openpty( &master_fd, &slave_fd, NULL, NULL, NULL ) != -1 )
    {
        const pid_t child_pid = fork();
        if( child_pid != -1 )
        {
            if( child_pid )
            {
                const char command[] = "command\n";
                close( master_fd );
                write( slave_fd, command, strlen(command) );
                close( slave_fd );
            }
            else
            {
                close( slave_fd );
                dup2( master_fd, STDIN_FILENO );
                execlp( "/bin/cat", "cat", (char*)0 );
            }
        }
    }

    return 0;
}

子プロセスに遅延を追加することもできますが、それでも機能します。したがって、親プロセスは、子プロセスが何かを行う前に終了できます。

~ # temp_test
~ # command
cat: read error: Input/output error

~ #

編集:

cat のエラー出力が混乱を招くため、少し異なる例:

        if( child_pid )
        {
            const char command[] = "command\n";
            close( master_fd );
            write( slave_fd, command, sizeof(command) );
            close( slave_fd );
        }
        else
        {
            char buffer[100];
            ssize_t i;
            ssize_t len;

            close( slave_fd );

            do
            {
                len = read( master_fd, buffer, sizeof(buffer) );
                for( i = 0; i < len; i++ )
                    printf("%c", buffer[i] );
            } while( len > 0 );
        }

そして結果:

~ # temp_test
command
~ #
于 2012-07-31T13:07:00.080 に答える