CI では単純にいくつかのパイプを作成し、dup2 を使用して std ファイル記述子を上書きしますが、反対側では、ブロック IO を利用して無限ループで各出力パイプ (sdtout、sdterr) のスレッドを作成します。コンソールの提案に合わせて textArea/canvas を更新するためのパイプ。stdin については、そのようなコンポーネントの主要なイベントをリッスンし、それらをパイプに書き込みます。
しかし、swing を使用して Java でそれを実行するにはどうすればよいでしょうか?
プロジェクト ディレクティブとしてネイティブ コードを混在させることはできません。これまでに多くのプロジェクト ディレクティブを破ったので、それを進めることはできません...
また、VT100 など、ある程度の端末エミュレーションを提供することもクールですが、そのような機能を Java アプリに通知する方法については、unix で TERM envvar を設定します。
CI では次のようになります。
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
static pthread_t workers[2];
static void *_worker(void *file)
{
int c;
if(!file) pthread_exit(NULL);
while((c=fgetc(file))!=EOF) {
// Sync and put C on the screen
}
pthread_exit(NULL);
}
int initConsole()
{
int stdin_pipe[2], stdout_pipe[2], stderr_pipe[2];
if(!(pipe(stdin_pipe)||pipe(stdout_pipe)||pipe(stderr_pipe))) {
if(dup2(stdin_pipe[0], STDIN_FILENO)<0) return -1;
if(dup2(stdout_pipe[1], STDOUT_FILENO)<0) return -1;
if(dup2(stderr_pipe[1], STDERR_FILENO)<0) return -1;
pthread_create(&workers[0], NULL, _worker, fdopen(stdout_pipe[0], "r"));
pthread_create(&workers[1], NULL, _worker, fdopen(stderr_pipe[0], "r"));
// Register a handler within the toolkit to push chars into the stdin_pipe
return 0;
}
return -1;
}