Cでページャを実装しようとしています。別の端末(xterm
)を開き、その中にいくつかの出力を出力します。Xtermページャ - 2つの端末出力 - パイプとdup2を使用
私は最初にパイプを作成し、メインプログラムをforkします。子プロセスはtailコマンドでxtermを実行し、メインプログラムはパイプ内のものを出力し、xtermを実行する前に子プロセスはstipin子のファイル記述子。
コードが機能しないため、pipe
とdup2
の誤解をしている可能性があります。
int p[2];
pipe(p);
char buff[512];
switch (fork()) {
case -1:
fprintf(stderr, "Fork error.\n");
break;
case 0:
dup2(p[0], 0);
close(p[0]);
close(p[1]);
execlp("xterm", "xterm", "tail", NULL);
break;
default:
scanf("%s", buff);
write(p[1], buff, strlen(buff));
getchar();
break;
}
今のところ、私は親に何かを入力しますが、どちらのプロセスでも何も印刷されません。 したがって、xtermと親プロセスとの間の通信を作成するにはどうすればよいですか?
編集:私のプログラムのサンプル:メインで
#define VERBM_NOVERB 0
#define VERBM_STDOUT 1
#define VERBM_XTERMO 2
static int fd_xterm = -1;
void init_outputxterm() {
mkfifo("/tmp/mypipe", 0600);
switch (fork()) {
case -1:
fprintf(stderr, "Fork error.\n");
break;
case 0:
execlp("xterm", "xterm", "-e", "/usr/bin/tail -f /tmp/mypipe", NULL);
printf("FAILURE\n");
exit(EXIT_FAILURE);
break;
default:
if ((fd_xterm = open("/tmp/mypipe", O_WRONLY)) == -1) {
fprintf(stderr, "Can't open pipe");
exit(1);
}
write(fd_xterm, "yayay\n", 6);
dprintf(fd_xterm, "Hello world\n");
getchar();
break;
}
}
void verbose_xterm(char *format, ...) {
dprintf(fd_xterm, BOLD UNDERLINED "verbose - " RESET);
va_list aptr;
va_start(aptr, format);
dprintf(fd_xterm, format, aptr);
va_end(aptr);
}
void verbose_stdout(char *format, ...) {
printf(BOLD UNDERLINED "verbose - " RESET);
va_list aptr;
va_start(aptr, format);
vprintf(format, aptr);
va_end(aptr);
}
void verbose_noverb(char *format, ...) {
}
void (*verbose)(char *format, ...) = verbose_stdout;
void (*verbose_mode[])(char *, ...) = {
verbose_noverb,
verbose_stdout,
verbose_xterm
};
void verbosity(int mode) {
if (mode == VERBM_XTERMO)
init_outputxterm();
verbose = verbose_mode[mode];
}
:verbose
には、いくつかの呼び出しが続く
verbosity(VERBM_XTERMO);
。 init_outputxterm
では、ソリューションのように、xtermを作成した直後にxtermに書き込むテンタビを見ることができます。しかし、すべてが表示されるのは、私がプログラムを終了した後、主端末を残酷に閉じて、孤児の処理を孤児にすることです(私がCtrl-C
で終了した場合、子供も殺されます)。
xtermを開いてすぐにそのコードを閉じると... –
あなたの 'tail'へのパスが異なるか、何らかの理由でパイプ'/tmp/mypipe'が正しく作成されていない可能性があります? – Ctx
それは動作します、ありがとう!メインターミナルがフローティングモードで起動され、i3がポップされたウィンドウの管理方法を知らなかったため、メインターミナルをタイリングモードで実行することによって解決されるため、私のタイリングウィンドウマネージャーi3から問題が発生しました。 –