- 论坛徽章:
- 0
|
回复 1# 5doumi
int gAPXWritefd, gAPXReadfd;
void apx_ExecCli()
{
pid_t pid;
int fd_in[2], fd_out[2];
if (pipe(fd_in) < 0 || pipe(fd_out))
{
return;
}
pid = fork();
if (pid == 0)
{
char cmd[2048];
//
close(fd_in[0]);
close(fd_out[1]);
dup2(fd_in[1], STDOUT_FILENO);
dup2(fd_out[0], STDIN_FILENO);
close(fd_in[1]);
close(fd_out[0]);
execl("/usr/local/bin/bcmcli", NULL); //启动要执行的交互程序
}
else
{
char buffer[1024];
int status, i;
FILE* fp;
sleep(1);
//
close(fd_out[0]);
close(fd_in[1]);
//开始读写
write(fd_out[1], "y\n", strlen("y\n"));
write(fd_out[1], "fabric\n", strlen("fabric\n"));
for (i = 0; i < APX_IFNUM; i++)
{
snprintf(buffer, sizeof(buffer), "show counters chang same z xe%d\n", i + 1);
write(fd_out[1], buffer, strlen(buffer));
}
write(fd_out[1], "exit\n", strlen("exit\n"));
write(fd_out[1], "exit\n", strlen("exit\n"));
close(fd_out[1]);
fp = fdopen(fd_in[0], "r");
buffer[0] = 0;
while (fgets(buffer, 2048, fp))
{
apx_RecordData(buffer);
buffer[0] = 0;
}
//结束读写
fclose(fp);
close(fd_in[0]);
wait(&status);
}
return;
}
在子进程启动要交互的程序,创建两个管道,分别做为子进程的标准输入输出,在父进程读写管道就可完成交互功能。
|
|