Linux下C编程

Linux下C编程,进程通信之无名管道通信

最近在看进程间的通信,下面说说管道通信之无名管道。

 

1.概述

 

  管道是Linux中很重要的一种通信方式,他是把一个程序的输出直接连接到另一个程序的输入,并且管道具有队列的特性。如Linux命令,“ps -ef | grep root”。如下图所示:

 

 

2.无名管道

 

  2.1特点

 

  (1)它只能用于具有亲缘关系的进程之间的通信(也就是父子进程或者兄弟进程之间)。
  (2)它是一个半双工的通信模式,具有固定的读端和写端。
  (3)管道也可以看成是一种特殊的文件,对于它的读写也可以使用普通的read、write等函数。但是它不是普通的文件,并不属于其他任何文件系统,并且只存在于内存中。

 

  2.2主要函数说明

 

  int pipe(int fd[2])

 

    传入参数fd[2]数组,管道的两个文件描述符,之后就可以直接操作这两个文件描述符。其中fd[0]是“读”描述符,fd[1]是“写”描述符。

 

  2.3使用代码及说明

 

复制代码
#include <unistd.h>
#include <sys/types.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
    int pipe_fd[2];  /*用于保存两个文件描述符*/
    pid_t pid;
    char buf_r[100];  /*用于读数据的缓存*/
int r_num;  /*用于保存读入数据大数量*/ memset(buf_r,0,sizeof(buf_r)); if(pipe(pipe_fd)<0) /*创建管道,成功返回0,否则返回-1*/ return -1; /*fork()创建一子进程,
   具体使用可以参见:http://www.cnblogs.com/xudong-bupt/archive/2013/03/26/2982029.html
*/
if((pid=fork())==0) { close(pipe_fd[1]); /*关闭子进程写描述符,并通过使父进程暂停 2 秒确保父进程已关闭相应的读描述符*/ sleep(2); if((r_num=read(pipe_fd[0],buf_r,100))>0) /*子进程读取管道内容*/ printf("%d numbers read from the pipe is %s\n",r_num,buf_r); close(pipe_fd[0]);/*关闭子进程读描述符*/ exit(0); } else if(pid>0) { close(pipe_fd[0]);/*/关闭父进程读描述符,并分两次向管道中写入 Hello Pipe*/ if(write(pipe_fd[1],"Hello",5)!= -1) printf("parent write1 success!\n"); if(write(pipe_fd[1]," Pipe",5)!= -1) printf("parent write2 success!\n"); close(pipe_fd[1]);/*关闭父进程写描述符*/ sleep(3); exit(0); } }
复制代码

 

03 2013 档案

Linux下C编程,进程通信之无名管道通信
摘要: 最近在看进程间的通信,下面说说管道通信之无名管道。1.概述 管道是Linux中很重要的一种通信方式,他是把一个程序的输出直接连接到另一个程序的输入,并且管道具有队列的特性。如Linux命令,“ps -ef | grep root”。如下图所示:2.无名管道 2.1特点 (1)它只能用于具有亲缘关系的进程之间的通信(也就是父子进程或者兄弟进程之间)。 (2)它是一个半双工的通信模式,具有固定的读端和写端。 (3)管道也可以看成是一种特殊的文件,对于它的读写也可以使用普通的read、write等函数。但是它不是普通的文件,并不属于其他任何文件系统,并且只存在于内存中。 2.2主要函数说...阅读全文

posted @ 2013-03-28 22:11 旭东的博客 阅读(24) | 评论 (0) 编辑

Linux下C编程,子进程创建函数fork() 执行解析
摘要: 最近在看进程间的通信,看到了fork()函数,虽然以前用过,这次经过思考加深了理解。现总结如下:1.函数本身 (1)头文件 #include<unistd.h> #include<sys/types.h> (2)函数原型 pid_t fork( void); (pid_t 是一个宏定义,其实质是int 被定义在#include<sys/types.h>中) 返回值: 若成功调用一次则返回两个值,子进程返回0,父进程返回子进程ID;否则,出错返回-1 (3)函数说明 一个现有进程可以调用fork函数创建一个新进程。由fork创建的新进程被称为子进程(child阅读全文

posted @ 2013-03-26 11:40 旭东的博客 阅读(591) | 评论 (0) 编辑

linux下的find文件查找命令与grep文件内容查找命令
摘要: 在使用linux时,经常需要进行文件查找。其中查找的命令主要有find和grep。两个命令是有区的。 区别:(1)find命令是根据文件的属性进行查找,如文件名,文件大小,所有者,所属组,是否为空,访问时间,修改时间等。 (2)grep是根据文件的内容进行查找,会对文件的每一行按照给定的模式(patter)进行匹配查找。 一.find命令 基本格式:find path expression 1.按照文件名查找 (1)find / -name httpd.conf #在根目录下查找文件httpd.conf,表示在整个硬盘查找 (2)find /etc...阅读全文

posted @ 2013-03-23 14:03 旭东的博客 阅读(26) | 评论 (0) 编辑

Linux系统内存管理之伙伴系统分析
摘要: 今天去面试,一位面试官提到了内存管理的伙伴系统,当时就懵了,因为根本就没有听说过。晚上回来在实验室查了一些资料,现总结如下: 1.伙伴系统概念 伙伴系统是一种经典的内存管理方法。Linux伙伴系统的引入为内核提供了一种用于分配一组连续的页而建立的一种高效的分配策略,并有效的解决了外碎片问题。 2.伙伴系统的组织结构 Linux中的内存管理的“页”大小为4KB。把所有的空闲页分组为11个块链表,每个块链表分别包含大小为1,2,4,8,16,32,64,128,256,512和1024个连续页框的页块。最大可以申请1024个连续页,对应4MB大小的连续内存。每个页块的第一个页的物理地址是该块...阅读全文

posted @ 2013-03-22 22:17 旭东的博客 阅读(518) | 评论 (0) 编辑

Java 网络爬虫获取网页源代码原理及实现
摘要: 1.网络爬虫是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成。传统爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL放入队列,直到满足系统的一定停止条件。 2.那么程序获取网页的原理到底是怎么回事呢?看下面的图:客服端首先向服务器端发出Http请求,之后服务器端返回相应的结果或者请求超时客户端自己报错。 服务器端发出的Http请求,实际上说是对服务器的文件的请求。下面的表格是一些常见的HTTP请求对应的文件。(因为第一列给出的都是主机的网址信息,主机一般都通过配置文件将该请求转换为网站主页地址i...阅读全文

posted @ 2013-03-20 21:35 旭东的博客 阅读(94) | 评论 (0) 编辑

海量数据处理的 Top K算法(问题) 小顶堆实现
摘要: 问题描述:有N(N>>10000)个整数,求出其中的前K个最大的数。(称作Top k或者Top 10) 问题分析:由于(1)输入的大量数据;(2)只要前K个,对整个输入数据的保存和排序是相当的不可取的。 可以利用数据结构的最小堆来处理该问题。 最小堆如图所示,对于每个非叶子节点的数值,一定不大于孩子节点的数值。这样可用含有K个节点的最小堆来保存K个目前的最大值(当然根节点是其中的最小数值)。 每次有数据输入的时候可以先与根节点比较。若不大于根节点,则舍弃;否则用新数值替换根节点数值。并进行最小堆的调整。 实现代码以及说明:#include<stdio...阅读全文

posted @ 2013-03-20 15:24 旭东的博客 阅读(643) | 评论 (0) 编辑

Java数据导出(写)Excel文件 解析
摘要: 在编程中经常需要使用到表格(报表)的处理主要以Excel表格为主。下面给出用java写入数据到excel表格方法: 1.添加jar文件 java导入导出Excel文件要引入jxl.jar包,最关键的是这套API是纯Java的,并不依赖Windows系统,即使运行在Linux下,它同样能够正确的处理Excel文件。下载地 址:http://www.andykhan.com/jexcelapi/ 2.jxl对Excel表格的认识 可以参见http://www.cnblogs.com/xudong-bupt/archive/2013/03/19/2969997.html 如下图是...阅读全文

posted @ 2013-03-20 11:49 旭东的博客 阅读(287) | 评论 (0) 编辑

Java数据导入(读)Excel文件 解析
摘要: 在编程中经常需要使用到表格(报表)的处理主要以Excel表格为主。下面给出用java读取excel表格方法: 1.添加jar文件 java导入导出Excel文件要引入jxl.jar包,最关键的是这套API是纯Java的,并不依赖Windows系统,即使运行在Linux下,它同样能够正确的处理Excel文件。下载地址:http://www.andykhan.com/jexcelapi/ 2.jxl对Excel表格的认识 (1)每个单元格的位置认为是由一个二维坐标(i,j)给定,其中i表示列,j表示行,并且从上到下递增,从左到右递增。 (2)对于合并单元格的以最左,最上的单元格的坐标...阅读全文

posted @ 2013-03-19 21:48 旭东的博客 阅读(527) | 评论 (2) 编辑

斐波那契数列 矩阵求法 优化
摘要: 在做编程题目的时候经常会遇到“斐波那契数列”相关的题目,尤其在做OJ中。下面说一些方法: (一)递归 递归是最慢的会发生重复计算,时间复杂度成指数级。long long fac(int n){ if(n==1) return 1; else if(n==2) return 2; else return fac(n-1)+fac(n-2);} (二)循环 利用临时变量来保存中间的计算过程,加快运算。long long fac(int n){ long long a=1,b=2,c; if(n==1) return 1; else if(n=...阅读全文

posted @ 2013-03-19 10:39 旭东的博客 阅读(640) | 评论 (0) 编辑

物件捆绑 背包问题 动态规划 求解
摘要: 物件捆绑背包问题:给定N元钱,要购买一些器件。器件有主件和附件之分,也即主件可以单独购买,然而购买附件必须购买对应的主件。下表就是一些主件与附件的例子:主件附件电脑 打印机、扫描仪书柜图书书桌 台灯工作椅无 把每件物品规定一个重要度,分为5等:用整数1~5表示,第5等最重要。在花费不超过N元(可以等于N元)的前提下,使每件物品的价格与重要度的乘积的总和最大。设第j件物品的价格为v[j],重要度为p[j],共选中了k件物品,编号依次为j1,j2,……,jk,则所求的总和为:v[j1]*p[j1]+v[j2]*p[j2]+…+v[jk]*p[jk]。 输入 第1行,为两个正整...阅读全文

posted @ 2013-03-18 17:10 旭东的博客 阅读(56) | 评论 (0) 编辑

砝码称重问题求解:动态规划与母函数方法
摘要: 砝码称重问题:设有1g、2g、3g、5g、10g、20g的砝码各若干枚(其质量<=1000g),求出用他们能称出的质量的种类数(不包括质量为0的情况)。 一、动态规划方法求解 设dp[1000]数组为标记数组。当dp[i]=0时,表示质量为i的情况,目前没有称出;当dp[i]=1时,表示质量为i的情况已经称出。 本题目中有多个砝码,我们顺序处理每一个砝码。 当处理第j个砝码,质量为wj时,有下列推导公式: 完整程序代码如下:#include<stdio.h>#include<string.h>int sum; ///表示输入的砝码的总质量int ...阅读全文

posted @ 2013-03-17 21:53 旭东的博客 阅读(688) | 评论 (0) 编辑

最长公共子序列求解:递归与动态规划方法
摘要: 在做OJ题目的时候,经常会用到字符串的处理。例如,比较二个字符串相似度。这篇文章介绍一下求两个字符串的最长公共子序列。 一个字符串的子序列,是指从该字符串中去掉任意多个字符后剩下的字符在不改变顺序的情况下组成的新字符串。 最长公共子序列,是指多个字符串可具有的长度最大的公共的子序列。 (1)递归方法求最长公共子序列的长度 1)设有字符串a[0...n],b[0...m],下面就是递推公式。 当数组a和b对应位置字符相同时,则直接求解下一个位置;当不同时取两种情况中的较大数值。 2)代码如下:#include<stdio.h>#include<string...阅读全文

posted @ 2013-03-15 14:46 旭东的博客 阅读(474) | 评论 (0) 编辑

linux下使用adduser与useradd命令批量添加用户
摘要: 在linux下添加用户的命令有 adduser与useradd ,这两个命令有些不同 。下面结合批量添加用户来说明。一.adduser批量添加用户 使用adduser时,创建用户的过程更像是一种人机对话,系统会提示你输入各种信息,然后会根据这些信息帮你创建新用户。这样我们没有必要知道那么多的参数,一样可以达到自定义添加用户。 步骤如下: (1)建立用户名列表文件username.txt stu1 stu2 stu3 stu4 stu5 stu6 (2)批量添加的脚本文件 ###在这里也可以设置用户所属的用户组for ado echo "/home/student/$a" .阅读全文

posted @ 2013-03-13 21:47 旭东的博客 阅读(560) | 评论 (0) 编辑

原文地址:https://www.cnblogs.com/Leo_wl/p/2987787.html