/*说明:了解Linux下进程和进程间通过管道通信
* 功能:统计2个文本文件的字数和,2个参数分别为两文件名
* 描述:父进程启动,开启子进程,子进程统计一个文本的字数,
* 待子进程结束,父进程统计另一个,在父进程中计算和打印统计结果
*/
#include < unistd.h >
#include < stdio.h >
#include < stdlib.h >
int count(FILE * );
int main( int argc, char * argv[])
{
int num1,num2,totalnum; //文件1,文件2,中的字数和总字数
FILE *fpin1,*fpin2; //两个文件指针
if (argc==3)
{
fpin1=fopen(argv[1],"r");
fpin2=fopen(argv[2],"r");
}
else if (argc>3)
printf("Too many args!! ");
else
printf("Input a file two file names to count their total words!! ");
pid_t child;
int status;
int fds[2];
int buf1[1],buf2[1];
pipe(fds); //开启管道
if ((child=fork())==-1)
{
perror("fork");
exit(EXIT_FAILURE);
}
else if (child==0) //子进程
{
close(fds[0]);
buf1[0]=count(fpin1);
write(fds[1],buf1,sizeof(int)); //结果写入管道
exit(1);
}
else //父进程
{
wait(0); //等待子进程结束
read(fds[0],buf2,sizeof(int)); //从管道中读子进程返回结果
num1=buf2[0];
num2=count(fpin2);
totalnum=num1+num2;
printf("There are %d words in file1 ",num1);
printf("There are %d words in file2 ",num2);
printf("There are %d words in total ",totalnum);
exit(1);
}
//关闭文件
fclose(fpin1);
fclose(fpin2);
return 0;
}
// 文件字数统计函数
int count(FILE * fpin)
{
// 略...
return 0;
}
* 功能:统计2个文本文件的字数和,2个参数分别为两文件名
* 描述:父进程启动,开启子进程,子进程统计一个文本的字数,
* 待子进程结束,父进程统计另一个,在父进程中计算和打印统计结果
*/
#include < unistd.h >
#include < stdio.h >
#include < stdlib.h >
int count(FILE * );
int main( int argc, char * argv[])
{
int num1,num2,totalnum; //文件1,文件2,中的字数和总字数
FILE *fpin1,*fpin2; //两个文件指针
if (argc==3)
{
fpin1=fopen(argv[1],"r");
fpin2=fopen(argv[2],"r");
}
else if (argc>3)
printf("Too many args!! ");
else
printf("Input a file two file names to count their total words!! ");
pid_t child;
int status;
int fds[2];
int buf1[1],buf2[1];
pipe(fds); //开启管道
if ((child=fork())==-1)
{
perror("fork");
exit(EXIT_FAILURE);
}
else if (child==0) //子进程
{
close(fds[0]);
buf1[0]=count(fpin1);
write(fds[1],buf1,sizeof(int)); //结果写入管道
exit(1);
}
else //父进程
{
wait(0); //等待子进程结束
read(fds[0],buf2,sizeof(int)); //从管道中读子进程返回结果
num1=buf2[0];
num2=count(fpin2);
totalnum=num1+num2;
printf("There are %d words in file1 ",num1);
printf("There are %d words in file2 ",num2);
printf("There are %d words in total ",totalnum);
exit(1);
}
//关闭文件
fclose(fpin1);
fclose(fpin2);
return 0;
}
// 文件字数统计函数
int count(FILE * fpin)
{
// 略...
return 0;
}
摘自:
Linux下进程间管道通信小作业
说明:
* 调用两次count()就可完成任务,不必fork子进程,所以本例仅仅用来演示管道通信。
* fork()返回子进程进程号PID,0表示为父进程,在此处进程执行一般分叉为两部份,分别是父进程与子进程。
* pipe()创建了一个管道,一对文件描述符分别表示输入 与输出。