自测之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,即程序与程序之间的对接.交接.交互.是测试系统组件间接口的一种测试. ...
随机推荐
- springsource-tool-suite插件下载
下载地址: https://spring.io/tools3/sts/all/ 下载页面上的 update sites archives文件
- Java客户端访问HBase集群解决方案(优化)
测试环境:Idea+Windows10 准备工作: <1>.打开本地 C:\Windows\System32\drivers\etc(系统默认)下名为hosts的系统文件,如果提示当前用户 ...
- 大数据技术原理与应用——分布式文件系统HDFS
分布式文件系统概述 相对于传统的本地文件系统而言,分布式文件系统(Distribute File System)是一种通过网络实现文件在多台主机上进行分布式存储的文件系统.分布式文件系统的设计一般采用 ...
- python应用:爬虫框架Scrapy系统学习第三篇——初识scrapy
scrapy的最通用的爬虫流程:UR2IM U:URL R2:Request 以及 Response I:Item M:More URL 在scrapy shell中打开服务器一个网页 cmd中执行: ...
- 【commons】字符串工具类——commons-lang3之StringUtils
类似工具见Hutool-StrUtil 一.起步 引入maven依赖 <!-- https://mvnrepository.com/artifact/org.apache.commons/com ...
- 成都Uber优步司机奖励政策(3月31日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- 宁波Uber优步司机奖励政策(12月21日到12月27日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- OpenCV代码提取:dft函数的实现
The Fourier Transform will decompose an image into its sinus and cosines components. In other words, ...
- 常用排序算法的C++实现
排序是将一组"无序"的记录序列调整为"有序"的记录序列. 假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在 ...
- dvs-panotracking编译运行
编译运行dvs-panotracking > 编译dvs-panotracking之前首先需要安装imageutilities . 源码下载 https://github.com/VLOGrou ...