进程间通信(二)
传递更多的数据
到目前为止我们所用的机制只是简单的在一个fread或是fwrite中发送或是接收全部的数据。有时我们也许以更小的尺寸发送数据,或是也许我们并不知道输出的大小。为了避免声明一个大的缓冲区,我们可以使用多个fread或是fwrite调用并分别处理这些数据。
下面是一个程序,popen3.c,由一个管道中读取所有的数据。
试验--由一个管道读取大量的数据
在这个程序中,我们由一个被调用的ps -alx进程读取数据。并没有办法预先知道会有多少输出,所以我们必须由管道中多次读取。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int main()
{
FILE *read_fp;
char buffer[BUFSIZ +1];
int chars_read;
memset(buffer,'/0',sizeof(buffer));
read_fp = popen("ps -ax","r");
if(read_fp != NULL)
{
chars_read = fread(buffer,sizeof(char),BUFSIZ,read_fp);
while(chars_read > 0)
{
buffer[chars_read - 1] = '/0';
printf("Reading:-/n %s/n",buffer);
chars_read = fread(buffer,sizeof(char),BUFSIZ,read_fp);
}
pclose(read_fp);
exit(EXIT_SUCCESS);
}
exit(EXIT_FAILURE);
}
我们得到的输出结果如下:
$ ./popen3
Reading:-
PID TTY STAT TIME COMMAND
1 ? S 0:04 init
2 ? SW 0:00 [kflushd]
3 ? SW 0:00 [kpiod]
4 ? SW 0:00 [kswapd]
5 ? SW< 0:00 [mdrecoveryd]
...
240 tty2 S 0:02 emacs draft1.txt
Reading:-
368 tty1 S 0:00 ./popen3
369 tty1 R 0:00 ps -ax
...