当前位置: 技术问答>linux和unix
关于标准输出的转向问题.
来源: 互联网 发布时间:2015-10-27
本文导语: 在一个程序A里,有没有办法把另一个程序B的标注输出读到A的一个变量里呢? 自己想到的一个方法是在A里运行system命令 让B的输出重定向到一个文件里,A再读出来但这样的效率太低了... 有没有更好的方法呢? ...
在一个程序A里,有没有办法把另一个程序B的标注输出读到A的一个变量里呢?
自己想到的一个方法是在A里运行system命令 让B的输出重定向到一个文件里,A再读出来但这样的效率太低了... 有没有更好的方法呢?
自己想到的一个方法是在A里运行system命令 让B的输出重定向到一个文件里,A再读出来但这样的效率太低了... 有没有更好的方法呢?
|
如果我没有确定错的话:你这个属于进程间的通信机制问题?即,一个进程的资源,另一个进程要使用的问题。
1.用文件的通信的方式是一种.
2.另外一种就是共享内存的方式,就是一个进程把资源存储到一个内存空间中,另一个进程来读,不过这种方式一定要主要加锁,即一个进程在进行读的时候,另外一个进程不能写,反之,一个进程写的时候,另外一个进程不能读。
1.用文件的通信的方式是一种.
2.另外一种就是共享内存的方式,就是一个进程把资源存储到一个内存空间中,另一个进程来读,不过这种方式一定要主要加锁,即一个进程在进行读的时候,另外一个进程不能写,反之,一个进程写的时候,另外一个进程不能读。
|
可以通过管道,命名管道,消息,共享内存等方式传递
|
大致如下
int fd[2];
int fd_err[2];
pipe(fd )
/*...判断返回..*/
pipe(fd_err )
/*...判断返回..*/
pid= fork()
/*...判断返回..*/
if( pid >0)
{
close( fd[1] );
close( fd_err[1] )
while( 1 )
{
ready_fd = select(max_fd+1, &rfds, NULL, NULL, &tv);
/*...判断返回..*/
if( FD_ISSET( fd[0],&rfds ) )/*如果有标准输出*/
{
read( fd[0],buffer_stdout,MAX_READ_BUF)
/*...判断返回..*/
}
if( FD_ISSET( fd_err[0],&rfds ) )/*如果有错误输出*/
{
read( fd_err[0],buffer_sterr,MAX_READ_BUF)
/*...判断返回..*/
}
if( !n_fd && !n_fd_err )/*子程序结束*/
{
close( fd[0] );
close( fd_err[0] );
break;
}
}
/*获取子进程退出状态*/
sleep(1);
if( (ret=waitpid(pid,&status,0))
int fd[2];
int fd_err[2];
pipe(fd )
/*...判断返回..*/
pipe(fd_err )
/*...判断返回..*/
pid= fork()
/*...判断返回..*/
if( pid >0)
{
close( fd[1] );
close( fd_err[1] )
while( 1 )
{
ready_fd = select(max_fd+1, &rfds, NULL, NULL, &tv);
/*...判断返回..*/
if( FD_ISSET( fd[0],&rfds ) )/*如果有标准输出*/
{
read( fd[0],buffer_stdout,MAX_READ_BUF)
/*...判断返回..*/
}
if( FD_ISSET( fd_err[0],&rfds ) )/*如果有错误输出*/
{
read( fd_err[0],buffer_sterr,MAX_READ_BUF)
/*...判断返回..*/
}
if( !n_fd && !n_fd_err )/*子程序结束*/
{
close( fd[0] );
close( fd_err[0] );
break;
}
}
/*获取子进程退出状态*/
sleep(1);
if( (ret=waitpid(pid,&status,0))