我试图使用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 );
}