自测之Lesson10:管道
题目:建立双向管道,实现:父进程向子进程传送一个字符串,子进程对该字符串进行处理(小写字母转为大写字母)后再传回父进程。
实现代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h> void TestPipeDouble()
{
pid_t pid;
int fd_A[2], fd_B[2];
if (pipe(fd_A) || pipe(fd_B)) { // 创建管道A和管道B
perror("pipe fail");
return;
}
char szBuf[1024];
pid = fork();
if (pid == 0) {
close(fd_A[1]);
close(fd_B[0]);
printf("Child pid:%d\n", getpid());
while(1) {
memset(szBuf, 0, 1024);
read(fd_A[0], szBuf, 1024);
int i;
for (i = 0; i < strlen(szBuf); ++i) {
if (szBuf[i] <= 'z' && szBuf[i] >= 'a') {
szBuf[i] += ('A' - 'a');
}
}
write(fd_B[1], szBuf, strlen(szBuf));
}
close(fd_A[0]);
close(fd_B[1]);
}
else {
close(fd_A[0]);
close(fd_B[1]);
printf("Father pid:%d\n", getpid());
while(1) {
usleep(1000);
printf("Send:");
scanf("%s", szBuf);
write(fd_A[1], szBuf, strlen(szBuf));
memset(szBuf, 0, 1024);
read(fd_B[0], szBuf, 1024);
printf("Recv:%s\n", szBuf);
}
close(fd_A[1]);
close(fd_B[0]);
} } int main()
{
TestPipeDouble();
return 0;
}
题目:基于管道,并借助于dup2、exec函数族,实现命令“ps -ef | grep pipe”。
实现代码:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h> // 相当于“ps -ef | grep pipe”
void TestPipeRedir() // 重定向
{
int fd[2];
pid_t pid;
if(pipe(fd) == -1) {
perror("pipe failed");
return;
}
pid = fork();
if (pid == 0) {
dup2(fd[1], STDOUT_FILENO); // 将本应输出至stdout的“ls -l”,转而输出至管道写端
close(fd[0]);
close(fd[1]);
execlp("ps", "ps", "-ef", NULL); // 参数列表以NULL结尾
}
else {
dup2(fd[0], STDIN_FILENO); // grep本应由stdin读入“ls -l”, 转而从管道读端读入
close(fd[0]);
close(fd[1]);
execlp("grep", "grep", "pipe", NULL);
}
} int main()
{
TestPipeRedir();
return 0;
}
题目:使用popen函数实现命令“ps -ef | grep pipe”。
实现代码:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h> /* 使用sort对数组arr进行排序 */
void TestPipePopen_easy()
{
int arr[] = {2, 3, 7, 3, 5, 10, 9};
FILE *pFile = popen("sort -n", "w"); // 当前进程将arr传入子进程sort
int i;
for (i = 0; i != sizeof(arr) / sizeof(int); i++) {
fprintf(pFile, "%d\n", arr[i]); // 父进程通过pFile来发送数据至子进程
}
pclose(pFile); // 一旦pclose,即开始执行sort命令
} /* 实现命令ps -ef | grep pipe */
void TestPipePopen_complex()
{
FILE *pRead = popen("ps -ef", "r"); // 子进程ps将数据写入当前进程
FILE *pWrite = popen("grep pipe", "w"); // 当前进程将数据写入子进程grep
char szBuf[1024];
while(fgets(szBuf, 1024, pRead)) // 逐行读取
{
fputs(szBuf, pWrite); }
pclose(pRead);
pclose(pWrite);
} int main()
{
TestPipePopen_easy();
TestPipePopen_complex();
return 0;
}
题目:通过命名管道实现任意两个进程间通信(一个进程在读,另一个在写)。
实现代码:
/*
* 命名管道
* 进程间通信————任意两个进程
*/
#include <stdio.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <string.h>
#include <fcntl.h> void ReadFifo(int fd)
{
char szBuf[1024];
while (1) {
memset(szBuf, 0, 1024);
read(fd, szBuf, 1024);
printf("Process[PID:%d] Recv:%s\n", getpid(), szBuf);
if (strcmp(szBuf, "exit") == 0) {
return;
}
}
} void WriteFifo(int fd)
{
char szBuf[1024];
while (1) {
setbuf(stdout, NULL);
printf("Process[PID:%d]Send:", getpid());
scanf("%s", szBuf);
write(fd, szBuf, strlen(szBuf));
if (strcmp("exit", szBuf) == 0) {
return;
}
}
} int main(int argc, char **argv)
{
if (argc != 3) {
printf("usage: %s [r | w] filename\n", argv[0]);
printf("\tr: read the fifo\n");
printf("\tw: write the fifo\n");
printf("\tfilename: the fifo file name\n");
return -1;
}
int fd;
struct stat info;
stat(argv[2], &info);
if (!S_ISFIFO(info.st_mode)) { // 判断是否为管道文件
printf("this file is not fifo\n");
return -1;
}
if (argv[1][0] == 'r') {
fd = open(argv[2], O_RDONLY); // 打开管道文件
if (fd < 0){
perror("open fail");
return -1;
}
ReadFifo(fd);
}
else if (argv[1][0] == 'w') {
fd = open(argv[2], O_WRONLY);
if (fd < 0) {
perror("open fail");
return -1;
}
WriteFifo(fd);
}
close(fd);
return 0;
}
自测之Lesson10:管道的更多相关文章
- MySQL mysqlslap压测
200 ? "200px" : this.width)!important;} --> 介绍 mysqlslap是mysql自带的一个性能压测工具:mysqlslap用于和其 ...
- [软件测试]网站压测工具Webbench源码分析
一.我与webbench二三事 Webbench是一个在linux下使用的非常简单的网站压测工具.它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作的性能.Webbench ...
- VS 2013驱动开发 + Windbg + VM双机调试(亲测+详解)
------------VS 2013驱动开发 + Windbg + VM双机调试(亲测+详解)------------- WIN10已上线,随之而来的是VS2015:微软在 "WDK760 ...
- 网站(Web)压测工具Webbench源码分析
一.我与webbench二三事 Webbench是一个在linux下使用的非常简单的网站压测工具.它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作的性能.Webbench ...
- 性能测试:压测中TPS上不去的几种原因分析(就是思路要说清楚)
转https://www.cnblogs.com/imyalost/p/8309468.html 先来解释下什么叫TPS: TPS(Transaction Per Second):每秒事务数,指服务器 ...
- [apue] 测试管道容量的一些疑问
所谓管道的容量,指不消费(读)的情况下,最大能写入的数据量.有两种方式来测试一个管道的容量: 1)使用阻塞写,每次写一个字节,并打印写入的总字节数,最后写入阻塞时,上次打印的就是管道的容量: 2)使用 ...
- redis之管道
Redis 的消息交互当我们使用客户端对 Redis 进行一次操作时,如下图所示,客户端将请求传送给服务器,服务器处理完毕后,再将响应回复给客户端.这要花费一个网络数据包来回的时间. 如果连续执行多条 ...
- webbench网站测压工具源码分析
/* * (C) Radim Kolar 1997-2004 * This is free software, see GNU Public License version 2 for * detai ...
- 多测师讲解接口测试 _理论基础知识001_高级讲师肖sir
前言: 我们今天进入接口测试的学习! 今天学习的内容是偏向理论 接口理论 了解接口测试(1) 一.什么是接口测试? 接口统称api,即程序与程序之间的对接.交接.交互.是测试系统组件间接口的一种测试. ...
随机推荐
- python初学者日记02(正则表达式)
写作时间:2018/12/17 作者:永远的码农(博客园) 一.正则表达式简介: 正则表达式,又称规则表达式.(英语:Regular Expression,在代码中常简写为regex.regexp或R ...
- 本地打jar包到本地的Maven出库
1.命令行输入 mvn install:install-file -DgroupId=jar包的groupId -DartifactId=jar包的artifactId -Dversion=jar包的 ...
- 了解jQuery并掌握jQuery对象和DOM对象的区别
jQuery的优势: 开源--开放源代码 轻量级 强大的选择器 出色的DOM操作(对DOM元素的一个增删改查) 完善的Ajax,出色的浏览器兼容性,丰富的插件支持,完善的文档(说明书) 链式操作方式, ...
- angular2配置使用ng2-bootstrap
第一步,安装.进入项目目录 npm install ng2-bootstrap bootstrap --save 第二步,angular-cli 配置 ng2-bootstrap src/.ang ...
- Java学习笔记二十八:Java中的接口
Java中的接口 一:Java的接口: 接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明.一个类通过继承接口的方式,从而来继承 ...
- Java学习笔记二十三:Java的继承初始化顺序
Java的继承初始化顺序 当使用继承这个特性时,程序是如何执行的: 继承的初始化顺序 1.初始化父类再初始子类 2.先执行初始化对象中属性,再执行构造方法中的初始化 当使用继承这个特性时,程序是如何执 ...
- Emgucv安装及使用
Emgucv安装 最近有个客户联系我,希望我能够为他们做一个识别瓷砖花纹的软件.应用场景是这样的:现场会有一个摄像头去拍摄流水线上运输的瓷砖,如果检测这块瓷砖的花纹不符合要求,则需要给PLC或输出板卡 ...
- Excelファイルを扱う方法
概要 データをローカルに落としたいという要件がある場合.ユーザーはExcelを希望するケースが多いだろう.そんな時は以下の汎用モジュールを使用して簡単に作る事ができます.使用方法は.GUI_UPLOA ...
- java 关键字super和this
super关键字 作用:调用父类的构造器 只能出现在子类的构造其中,并且必须是第一行 super()中的参数,决定了调用父类的那个构造器 注:如果子类构造器中没有出现super,则默认加上super( ...
- 北京Uber优步司机奖励政策(4月4日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...