如何在子进程仍在运行时读取()子进程的输出

时间:2015-07-16 01:41:19

标签: c parent-child wait

我试图使用read()读取子进程的输出。

我的孩子进程是基于文本的RPG游戏。我的父母是一个AI解算器,它将读取quester的输出,并给它输入。

我需要阅读我孩子的输出,而我的子进程正在等待输入提示>

我使用popen2(),双端管道

的实施创建了我的管道

问题:每次我尝试读取我的子管道时,都会出现无限循环。这是因为当我的孩子通过其提示“>”等待输入时,我试图读取()。

我的源代码在下面

这里有一些注意事项:

*如果我注释掉我对kill()的调用,当我调用read()时,我仍然陷入无限循环。

理论上,我的想法是:

*孩子给我输出 - >儿童SIGSTOP - >处理输出 - >给我的孩子输入 - >儿童SIGCONT - >环

#define _POSIX_SOURCE
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <errno.h>
#include <signal.h>

/**
 * popen2 and struct popen2 
 * taken from http://emergent.unpythonic.net/01108826729
 * Website Copyright © 2004-2014 Jeff Epler
 */

char *const *parmList;
struct popen2
{
    pid_t child_pid;
    int   from_child, to_child;
};

int popen2(char * const argv, struct popen2 *childinfo)
{
    pid_t p;
    int pipe_stdin[2], pipe_stdout[2];

    if(pipe(pipe_stdin)) return -1;
    if(pipe(pipe_stdout)) return -1;

    p = fork();
    if(p < 0) return p; /* Fork failed */
    if(p == 0) { /* child */
        close(pipe_stdin[1]);
        dup2(pipe_stdin[0], 0);
        close(pipe_stdout[0]);
        dup2(pipe_stdout[1], 1);
        execv( "./quester", parmList );
        perror( "execl" ); exit(99);
    }
    childinfo->child_pid = p;
    childinfo->to_child = pipe_stdin[1];
    childinfo->from_child = pipe_stdout[0];
    return 0;
}

void ai_go (char * buffer, size_t count)
{


}

int main ( int argc, char * const argv[] )
{
  struct popen2* childinfo = calloc( 1, sizeof( struct popen2 ) );
  parmList = argv;
  popen2( *argv, childinfo );

  kill( childinfo->child_pid, SIGSTOP );

  char * buffer = calloc ( 256, sizeof ( char ) );

  read ( childinfo -> from_child, buffer, 100 );


}

0 个答案:

没有答案