Linux下进程间管道通信小作业
在进行这次作业之前,我们先来看看什么是管道吧!
管道是Linux中很重要的一种通信方式,是把一个程序的输出直接连接到另一个程序的输入,常说的管道多是指无名管道,无名管道只能用于具有亲缘关系的进程之间,这是它与有名管道的最大区别。
有名管道叫named pipe或者FIFO(先进先出),可以用函数mkfifo()创建。
Linux管道的实现机制
在Linux中,管道是一种使用非常频繁的通信机制。从本质上说,管道也是一种文件,但它又和一般的文件有所不同,管道可以克服使用文件进行通信的两个问题,具体表现为:
· 限制管道的大小。实际上,管道是一个固定大小的缓冲区。在Linux中,该缓冲区的大小为1页,即4K字节,使得它的大小不象文件那样不加检验地增长。使用单个固定缓冲区也会带来问题,比如在写管道时可能变满,当这种情况发生时,随后对管道的write()调用将默认地被阻塞,等待某些数据被读取,以便腾出足够的空间供write()调用写。
· 读取进程也可能工作得比写进程快。当所有当前进程数据已被读取时,管道变空。当这种情况发生时,一个随后的read()调用将默认地被阻塞,等待某些数据被写入,这解决了read()调用返回文件结束的问题。
注意:从管道读数据是一次性操作,数据一旦被读,它就从管道中被抛弃,释放空间以便写更多的数据。
在网上看到这么个小作业,用来学习Linux管道,妥妥的。
/*说明:一次作业,目的是了解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==)
{
fpin1=fopen(argv[],"r");
fpin2=fopen(argv[],"r");
}
else if(argc>)
printf("Too many args!!\n");
else
printf("Input a file two file names to count their total words!!\n"); pid_t child;
int status;
int fds[];
int buf1[],buf2[];
pipe(fds); //开启管道
if((child=fork())==-)
{
perror("fork");
exit(EXIT_FAILURE);
}
else if (child==) //子进程
{
close(fds[]);
buf1[]=count(fpin1);
write(fds[],buf1,sizeof(int)); //结果写入管道
exit();
}
else //父进程
{
wait(); //等待子进程结束
read(fds[],buf2,sizeof(int)); //从管道中读子进程返回结果
num1=buf2[];
num2=count(fpin2);
totalnum=num1+num2;
printf("There are %d words in file1\n",num1);
printf("There are %d words in file2\n",num2);
printf("There are %d words in total\n",totalnum);
exit();
}
//关闭文件
fclose(fpin1);
fclose(fpin2);
return ;
} //文件字数统计函数
int count(FILE* fpin)
{
int num=;
char ch;
int start=; //字是否开始
int end=; //字是否结束
while(!feof(fpin))
{
ch=getc(fpin);
if((ch>=&&ch<=)||(ch>=&&ch<=)) //字以字母开头
start=;
if(ch==||ch==||ch==||ch==) //字以换行,回车,指标符,空格结束
end=;
if(start==&&end==) //字开始并结束了字数加1
{
num++;
start=; //清0准备下一个统计
end=;
}
}
return num;
}
Linux下进程间管道通信小作业的更多相关文章
- 【Linux】Linux下进程间的通信方式
本文内容: 1.进程通信的目的 2.介绍Linux下进程间的4种通信方式:管道,消息队列,共享内存,信号量 ps:套接字也可以用于进程间的通信,不过是不同物理机器上的进程通信,本章讨论是是同一台物理机 ...
- c++ 网络编程(三) LINUX/windows 进程间的通信原理与实现代码 基于多进程的服务端实现
原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/9613027.html 锲子:进程与线程是什么,他们的区别在哪里: 1 进程概念 进程是程序的一 ...
- WCF实现进程间管道通信Demo
一.代码结构: 二.数据实体类: using System; using System.Collections.Generic; using System.Linq; using System.Run ...
- Linux下进程通信之管道
每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把 ...
- Linux进程间的通信
一.管道 管道是Linux支持的最初Unix IPC形式之一,具有以下特点: A. 管道是半双工的,数据只能向一个方向流动: B. 需要双工通信时,需要建立起两个管道: C. 只能用于父子进程或者兄弟 ...
- 【网络编程基础】Linux下进程通信方式(共享内存,管道,消息队列,Socket)
在网络课程中,有讲到Socket编程,对于tcp讲解的环节,为了加深理解,自己写了Linux下进程Socket通信,在学习的过程中,又接触到了其它的几种方式.记录一下. 管道通信(匿名,有名) 管道通 ...
- Linux下进程通信的八种方法
Linux下进程通信的八种方法:管道(pipe),命名管道(FIFO),内存映射(mapped memeory),消息队列(message queue),共享内存(shared memory),信号量 ...
- Linux下多任务间通信和同步-概述
Linux下多任务间通信和同步-概述 嵌入式开发交流群280352802,欢迎加入! 在前面,我们学习了两种多任务的实现手段:进程和线程.由于进程是工作在独立的内存空间中,不同的进程间不能直接访问到对 ...
- [置顶] 简单解析linux下进程通信方法
linux下的进程通信手段基本上是从Unix平台上的进程通信手段继承而来的.而对Unix发展做出重大贡献的两大主力AT&T的贝尔实验室及BSD(加州大学伯克利分校的伯克利软件发布中心)在进程间 ...
随机推荐
- DataTable举例
// clrTest1.cpp: 主项目文件. #include "stdafx.h" using namespace System; using namespace System ...
- 张江在线APP演示
app下载地址:https://itunes.apple.com/cn/app/zhang-jiang-zai-xian/id722630317?mt=8
- uboot使用tftp下载时出现“checksum bad”问题原因分析
一.问题 二.原因分析 你的虚拟机是不是这样设置的呢? 如果是的话,请看下边的解释: 使用NAT模式,就是让虚拟系统借助NAT(网络地址转换)功能,通过宿主机器所在的网络来访问公网.也就是说,使用NA ...
- Laravel框架——自己写的类找不到
composer.json my model files are stored in directory of app\models, therefor "autoload": { ...
- Explain语法
EXPLAIN SELECT -- 变体: 1. EXPLAIN EXTENDED SELECT -- 将执行计划"反编译"成SELECT语句,运行SHOW WARNINGS 可得 ...
- 未能加载文件或程序集XXX或它的某一个依赖项。试图加载格式不正确的程序。
今天发布网站时,老是弹出下面这样一个错误. 经过一番折腾终于找到答案: 方法一: 在IIS中设置, 属性 ——常规—— 启用32位应用程序 修改为True. 方法二: 修改项目属性——生成——目标平台 ...
- BZOJ 3744 Gty的妹子序列
Description 我早已习惯你不在身边, 人间四月天 寂寞断了弦. 回望身后蓝天, 跟再见说再见-- 某天,蒟蒻Autumn发现了从 Gty的妹子树上掉落下来了许多妹子,他发现 她们排成了一个序 ...
- [BZOJ 1833] [ZJOI2010] count 数字计数 【数位DP】
题目链接:BZOJ - 1833 题目分析 数位DP .. 用 f[i][j][k] 表示第 i 位是 j 的 i 位数共有多少个数码 k . 然后差分询问...Get()中注意一下,如果固定了第 i ...
- Kernel-Scheduler implementation
2033 const struct sched_class rt_sched_class = { 2034 .next = &fair_sched_class, 2035 .enqueue_t ...
- Integer Intervals(贪心)
Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 12123 Accepted: 5129 Description An i ...