2016-04-07 17 views
0

Cでページャを実装しようとしています。別の端末(xterm)を開き、その中にいくつかの出力を出力します。Xtermページャ - 2つの端末出力 - パイプとdup2を使用

私は最初にパイプを作成し、メインプログラムをforkします。子プロセスはtailコマンドでxtermを実行し、メインプログラムはパイプ内のものを出力し、xtermを実行する前に子プロセスはstipin子のファイル記述子。

コードが機能しないため、pipedup2の誤解をしている可能性があります。

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で終了した場合、子供も殺されます)。

答えて

1

Xterm自体は標準入力から読み込まないため、データを入力することは効果がありません。しかし、あなたはこのような例のために、それから/ mypipeテール-f/tmpにして名前付きパイプを開いて読むことができる:

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); 
     exit(EXIT_FAILURE); 
     break; 
    default: 
     ; 
     char buff[512]; 
     int fd = open("/tmp/mypipe", O_WRONLY); 
     scanf("%s", buff); 
     write(fd, buff, strlen(buff)); 
     getchar(); 
     break; 
} 

をこれが名前付きパイプ/tmp/mypipeを開きます。親プロセスはそれにデータを書き込み、xtermのtail -fプロセスはそれを後で出力します。

+0

xtermを開いてすぐにそのコードを閉じると... –

+0

あなたの 'tail'へのパスが異なるか、何らかの理由でパイプ'/tmp/mypipe'が正しく作成されていない可能性があります? – Ctx

+0

それは動作します、ありがとう!メインターミナルがフローティングモードで起動され、i3がポップされたウィンドウの管理方法を知らなかったため、メインターミナルをタイリングモードで実行することによって解決されるため、私のタイリングウィンドウマネージャーi3から問題が発生しました。 –

関連する問題