0

C でページャーを実装しようとしています。コードで別のターミナル ( xterm) を開き、いくつかの出力を出力したいと考えています。

最初にパイプを作成し、メイン プログラムを fork します。子は tail コマンドで xterm を実行し、メイン プログラムはパイプ内のものを出力し、xterm を実行する前に子はパイプを複製し、パイプを stdin ファイル記述子に関連付けます。子。

コードが機能しないため、pipeandの使用法を誤解している可能性があります。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];
}

概して:

verbosity(VERBM_XTERMO);

へのいくつかの呼び出しが続きますverboseinit_outputxtermソリューションのように、xterm の作成直後に xterm に書き込むテントビエで確認できます。しかし、メインターミナルを残忍に閉じてプログラムを終了した後にのみすべてが表示され、子プロセスが孤児になります(子プロセスを終了するとCtrl-C、子供も殺されます)。

4

1 に答える 1