7

SO については多くの質問があるようですが、私が探しているものではありません。メインプログラムからスレッド/子プロセスを使用して新しいターミナルウィンドウ(Linux)を開き、そのスレッド/子プロセスに新しいウィンドウを所有させる方法があるかどうかを確認しようとしています。

完全な目的の概要: 起動するメイン プログラムを用意しstdin、 を介して入力を受け取ります。入力を選択して「ヘルパーを開始」すると、それ自体が対話できる新しいターミナル ウィンドウが生成されます。ユーザー (標準入力/標準出力)。

だから私がしたいのは、メインプログラムにスレッドを呼び出しさせ、スレッドに新しい端末ウィンドウを使用/所有させ、スレッドが消えて死ぬときにそのウィンドウを閉じることです。

このコードが正しく機能しないことはわかっていますが、概念的には、次のようなものが必要です。

void * Runit()
{
    system("gnome-terminal"); //Would like to get a handle to this window
    while(1)
      printf("I'm the thread!!!\n"); //Would like to get this printed to the new window
}

int main()
{
    pthread_t child;
    pthread_create(&child, NULL, Runit, NULL);
    sleep(10);
    return 0; //Would like the child & its window to go away now.
}

これに関する要件は緩いです。移植可能である必要はありません。これは、私の生活を楽にするための小さな Linux ツールです。Cコードである必要があるため、そのスクリプトをCから実行できない限り、シェルスクリプトはありません。ヘルプやその他のアイデアも大歓迎です。

編集:

Linux端末にはファイルハンドルがあることを認識しており、/dev/pts/x次のようなコードを試しました:

system("gnome-terminal");
sleep(2); //let the file handle show up in /dev/pts
fp = fopen("/dev/pts/<new file handler number>");
fprintf(fp, "echo hi");

ハンドルは正しく開きますが、ターミナルには何も表示されません。

4

3 に答える 3

2

gnome-terminalxtermの両方で、ターミナルが開いたら任意のコマンドを実行できます。

したがって、(ソケット、名前付きパイプ、またはその他の IPC メカニズムを介して) メイン プログラムと通信する方法を知っているヘルパー プログラムを作成することをお勧めします。スレッドは端末プログラムを生成し、ヘルパー プログラムを渡します。ヘルパー プログラムは端末内で実行され、前述の IPC チャネルを介してスレッドと通信します。

于 2012-09-26T16:56:33.793 に答える
1

ライブラリlibvte、特にvte_pty_*関数は、あなたが望むことを行うことができるかもしれません。

質問の言い方は、Windows とターミナル I/O が Linux (または、実際には Unix 一般) でどのように機能するかを理解していないことを示唆しているため、これらのことを読むことを強くお勧めします。W. Richard Stevens の著書Advanced Programming in the Unix Env​​ironment から始めてください。

于 2012-09-26T16:53:31.307 に答える
0

私が理解しているように、アプリケーションは端末に印刷できる必要がありますが、それからも読み取ることができますか?端末はユーザーが制御する必要がありますか?

ターミナルのファイル記述子を操作します。ターミナルがユーザー入力を取得するファイル(おそらくstdinではなく/ dev / pts?)と、ターミナルが出力を書き込むファイルを確認する必要があります。それをキャプチャし、それに書き込むこともできます。これにより、コンテンツが端末に表示されます。ただし、注意してください:1)ターミナル自体はおそらくシェル(bash)を起動します-/ dev / ptsに書き込むと、ターミナルに表示されますが、ターミナルのbashプロセスには渡されません-できませんそのような端末でリモートでコマンドを作成します。2)ターミナルの起動時に/ dev / pts / xファイルが作成されると思います。そのため、fork + dup + execを実行して、ターミナルの出力をキャプチャすることはできません。ターミナルで実行すると、一部の出力も出力されます-/ dev/ptsからは読み取られません

たぶん、ターミナルで実行されるだけのアプリケーションをCで作成する必要があり、そのアプリケーションは、ターミナルを所有するアプリケーションと通信しますか?

于 2012-09-26T17:02:46.833 に答える