08 2019 档案
摘要:事件模型 EPOLL事件有两种模型: Edge Triggered (ET) 边缘触发只有数据到来才触发,不管缓存区中是否还有数据。 Level Triggered (LT) 水平触发只要有数据都会触发。 思考如下步骤: 在这个过程中,有两种工作模式: ET模式 ET模式即Edge Triggere
阅读全文
摘要:epoll是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率,因为它会复用文件描述符集合来传递结果而不用迫使开发者每次等待事件之前都必须重新准备要被侦听的文件描述符集合,另一点原因就是获取事件的时候,它无须遍历整个被
阅读全文
摘要:函数是组织好的,可重复使用的,用来实现单一,或相关功能的代码段。 函数能提高应用的模块性,和代码的重复使用率。 定义一个函数 可以定义一个由自己想要功能的函数,以下是简单规则: l 函数代码块是以def关键词开头,后接函数标识符名称和圆括号。 l 任何传入参数和自变量都必须放在圆括号中,圆括号之间可
阅读全文
摘要:计算1-100之和 实现99乘法法则 运算结果: robot@ubuntu:~/wangqinghe/python/20190827$ python3 mul.py 1 * 1 = 1 1 * 2 = 2 2 * 2 = 4 1 * 3 = 3 2 * 3 = 6 3 * 3 = 9 1 * 4 =
阅读全文
摘要:迭代器 迭代是Python最强大的功能之一,是访问元素集合的一种方法。 迭代器是一个可以记住遍历的位置的对象。 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束,迭代器只能向前不会后退。 迭代器有两个基本方法,iter()和next()。 字符串,列表,或元组对象都可以用于创建迭代器
阅读全文
摘要:Python中while语句的一般形式: while 判断条件: 语句 同样需要注意冒号和缩进,另外在Python中没有do…while循环 下面的实例计算1到100总和 运行结果: robot@ubuntu:~/wangqinghe/python/20190826$ python3.5 calc.
阅读全文
摘要:if语句: Python中if语句的一般形式如下: if语句关键词: if – elif – else 注意: 实例:x为0-99取一个数,y为0-199取一个数,若x>y则输出x,x等于y,输出x+y,否则输出y choice函数 choice()方法返回一个列表,元组,或字符串的随机数 它不能直
阅读全文
摘要:集合(set)是一个无序的不重复元素序列。 可以使用大括号{ } 或set()函数来创建集合,注意:创建一个空集合必须用set(),{ }是用来创建一个空字典的。 创建格式: 两个集合之间的运算: a – b : 集合a中包含而b中不包含的元素 a | b :集合a或集合b包含的所有元素 a & b
阅读全文
摘要:Mysql导入.sql文件 souce /home/robot/csql.sql 数据库文件.sql文件放在/home/robot目录下 按照时间删除数据库数据 DELETE FROM 表名 WHERE 时间段 >= 开始时间 AND 时间段 <= 结束时间 实例: mysql> DELETE FR
阅读全文
摘要:poll服务器方法采用将监听端口用数组存放起来,这样就不需要轮询的监听整个文件描述符了 如果不再监控某个文件描述符时,可以把pollfd中,fd设置为-1,poll不再监控此pollfd,下次返回时,把revents设置为0。 client 同样的包含了wrap.c和wrap.h的文件,放在错误分析
阅读全文
摘要:select server client 包含了”wrap.c”和“wrap.h”文件在上两篇博客中,这里就不重复给出了
阅读全文
摘要:makefile主要是添加了-lpthread线程库 这是服务器编写代码,客户端代码可以使用上篇,也可以使用命令:nc + IP地址+端口号来代替客户端作用 运行结果: 还使用了wrap.c和wrap.h文件,在上篇博客有,这里就重复使用了。
阅读全文
摘要:注意:包含了“wrap.c” 和“wrap.h”文件在上篇博客中 运行结果: 以上程序由于没有回收机制,所以出现僵尸进程 版本2 使用进程回收函数回收僵尸进程 运行结果:
阅读全文
摘要:字典是另一种可变容器模型,可存储任意类型的对象。 字典的每个键值(key=>value)对用冒号分隔,每个对之间用逗号分隔,整个字典包括在花括号里,格式如下 键必须是唯一,但值则不必。 值可以取任何数据类型,但键必须是不可变的,如字符串,数字或元组。 一个简单字典实例: 创建字典: 访问字典的值 把
阅读全文
摘要:序列是Python最基本的数据结构,序列中的每个元素都分配一个数字—它的位置,或索引,第一个索引是0,第二个索引是1,以此类推 Python有6个序列的内置类型。但最常见的是列表和元组 序列都可以进行的操作包括索引、切片、加、乘、检查成员。 此外Python已经内置确定序列的长度以及确定最大和最小的
阅读全文
摘要:Python的元组与列表相似,不同之处在于元组的元素不能修改 元组使用小括号,列表使用方括号 元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可。 创建空元组 元组只包含一个元素时,需要在元素后面添加逗号,否则括号会被当作运算符使用: 元组与字符串类似,下标索引从0开始,可以进行截取、组合
阅读全文
摘要:pthread_join函数 阻塞等待线程退出,获取线程退出状态 其作用,对应进程中 waitpid() 函数。 int pthread_join(pthread_t thread, void **retval); 成功:0;失败:错误号 参数:thread:线程ID (【注意】:不是指针);ret
阅读全文
摘要:Python3数字数据类型用于存储数值。 数据类型是不允许改变的,这就意味着,如果改变数字数据类型的值,将重新分配内存空间。 Python支持三种不同不同的数值类型: 整型(int):通常是被称为整型或整数,是正或负整数,不带小数点。python3整型是没有限制大小的。可以当作Long类型使用 浮点
阅读全文
摘要:server 下面通过最简单的客户端/服务器程序的实例来学习socket API。 server.c的作用是从客户端读字符,然后将每个字符转换为大写并回送给客户端。 client client.c的作用是从命令行参数中获得一个字符串发给服务器,然后接收服务器返回的字符串并打印。 由于客户端不需要固定
阅读全文
摘要:字符串是Python中最常用的数据类型,可以使用单引号或双引号来创建字符串 创建字符串很简单,为变量分配一个值即可。 Python访问字符串的值 Python不支持单字符类型,单字符在Python中也是作为 一个字符串使用 Python访问子字符串,可以使用方括号来截取字符串,如下: 运行结果: r
阅读全文
摘要:互斥量mutex 进程间也可以使用互斥锁,来达到同步的目的。但应在pthread_mutex_init初始化之前,修改其属性为进程间共享。mutex的属性修改函数主要有以下几个。 主要应用函数: pthread_mutexattr_t mattr 类型: 用于定义mutex锁的【属性】 pthrea
阅读全文
摘要:借助 fcntl函数来实现锁机制。 操作文件的进程没有获得锁时,可以打开,但无法执行read、write操作。 fcntl函数: 获取、设置文件访问控制属性。 int fcntl(int fd, int cmd, ... /* arg */ ); 参2: F_SETLK (struct flock
阅读全文
摘要:进化版的互斥锁(1 --> N) 由于互斥锁的粒度比较大,如果我们希望在多个线程间对某一对象的部分数据进行共享,使用互斥锁是没有办法实现的,只能将整个数据对象锁住。这样虽然达到了多线程操作共享数据时保证数据正确性的目的,却无形中导致线程的并发性下降。线程从并行执行,变成了串行执行。与直接使用单进程无
阅读全文
摘要:条件变量: 条件变量本身不是锁!但它也可以造成线程阻塞。通常与互斥锁配合使用。给多线程提供一个会合的场所。 主要应用函数: pthread_cond_init函数 pthread_cond_destroy函数 pthread_cond_wait函数 pthread_cond_timedwait函数
阅读全文
摘要:读写锁 与互斥量类似,但读写锁允许更高的并行性。其特性为:写独占,读共享。 读写锁状态: 一把读写锁具备三种状态: 1. 读模式下加锁状态 (读锁) 2. 写模式下加锁状态 (写锁) 3. 不加锁状态 读写锁特性: 读写锁也叫共享-独占锁。当读写锁以读模式锁住时,它是以共享模式锁住的;当它以写模式锁
阅读全文
摘要:控制原语对比 进程 线程 fork pthread_create exit pthread_exit wait pthread_join kill pthread_cancel getpid pthread_self 命名空间 线程属性 本节作为指引性介绍,linux下线程的属性是可以根据实际项目需
阅读全文
摘要:pthread_detach函数 实现线程分离 int pthread_detach(pthread_t thread); 成功:0;失败:错误号 线程分离状态:指定该状态,线程主动与主控线程断开关系。线程结束后,其退出状态不由其他线程获取,而直接自己自动释放。网络、多线程服务器常用。 进程若有该机
阅读全文
摘要:pthread_exit函数 将单个线程退出 void pthread_exit(void *retval); 参数:retval表示线程退出状态,通常传NULL 思考:使用exit将指定线程退出,可以吗? 【pthrd_exit.c】 结论:线程中,禁止使用exit函数,会导致进程内所有线程全部退
阅读全文
摘要:Python语言支持以下类型的运算符: l 算术运算符 l 比较运算符 l 赋值运算符 l 逻辑运算符 l 位运算符 l 成员运算符 l 身份运算符 l 运算符优先级 Python算术运算符 运行结果: robot@ubuntu:~/wangqinghe/python/20190821$ vim a
阅读全文
摘要:同步概念 所谓同步,即同时起步,协调一致。不同的对象,对“同步”的理解方式略有不同。如,设备同步,是指在两个设备之间规定一个共同的时间参考;数据库同步,是指让两个或多个数据库内容保持一致,或者按需要部分保持一致;文件同步,是指让两个或多个文件夹里的文件保持一致。等等 而,编程中、通信中所说的同步与生
阅读全文
摘要:变量存储在内存中的值,这就意味着在创建变量时会在内存开辟一个空间。 基于变量的数据类型,解析器会分配指定内存,并决定什么数据可以被存储在内存中。 因此变量可以指定不同的数据类型,这些变量可以存储整数、小数、或字符。 变量赋值 Python中的变量赋值不需要类型声明。 每个变量在内存中创建,都包括变量
阅读全文
摘要:C/C++头文件一览C、传统 C++#include <assert.h> //设定插入点#include <ctype.h> //字符处理#include <errno.h> //定义错误码#include <float.h> //浮点数处理#include <fstream.h> //文件输入/
阅读全文
摘要:pthread_self函数 获取线程ID。其作用对应进程中 getpid() 函数。 pthread_t pthread_self(void); 返回值:成功:0; 失败:无! 线程ID:pthread_t类型,本质:在Linux下为无符号整数(%lu),其他系统中可能是结构体实现 线程ID是进程
阅读全文
摘要:Python标识符 在Python中,标识符由字母、下划线、数字组成。 在Python中,所有的标识符可以包括英文, 数字以及下划线(_),但是不能以数字开头。 Python中的标识符是区分大小写的。 以下划线开头的标识符是由特殊意义的。 l 以单下划线开头的 _foo 的代表不能直接访问的类属性
阅读全文
摘要:接触一门计算机新语言,第一件事就是要准备好一个编译器用来打代码。 网上很多环境搭建的方法,具体参照https://www.runoob.com/python/python-install.html 由于我之前一直在使用Ubuntu的gcc编译,恰好也可以运行python程序,我也就没有过多的琢磨编译
阅读全文
摘要:多线是多任务处理的一种特殊方式,多任务处理允许让电脑同事运行两个或两个以上的程序,一般情况下,两种类型的多任务处理:基于进程和基于线程。 基于进程的多任务处理是程序的并发执行。 基于线程的多任务处理是同一程序的片段的并发执行。 多线程程序包含可以同时运行的两个或多个部分。这样的程序中的每个部分称为一
阅读全文
摘要:信号是由操作系统传给进程的中断,会提早终止一个程序。在UNIX、LINUX、Mac OS或windows系统上,可以通过按Ctrl+c产生中断。有些信号不能被程序捕获,但是下表所列信号可以在程序中被捕获,并可以基于信号采取适当的动作。这些信号是定义在C++头文件<csignal>中。 信号 描述 S
阅读全文
摘要:预处理器是一些指令,指示表一起在实际编译之前所需要完成的预处理。 所有的预处理器指令都是以井号(#)开头,只有空格字符可以出现在预指令处理之前。预处理指令不是C++语句,所以他们不会以分号(;)结尾。 #define预处理 #define预处理指令用于创建符号常量。该符号常量通常称之为宏,指令的一般
阅读全文
摘要:模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码。 模板是创建泛型或函数的蓝图或公式。库容量,比如迭代器和算法,都是泛型编程的例子。 每个容器都有一个单一的定义,比如向量,我们可以定义许多不同类型的向量。比如vector<int> 或vector<string> 函数模板 模板
阅读全文
摘要:C++引入命名空间,作为附加信息来区分不同库中相同名称的函数,类,变量等,使用了命名空间即定义了上下问,本质上命名空间就是定义了一个范围。 定义命名空间: 命令空间的定义使用关键字namespace,后面跟命名空间的名称,如下所示: 为了调用带有命名空间的函数或变量,需要在前面加上命名空间的名称,如
阅读全文
摘要:iostream标准库提供了cin和cout方法用于标准输入读取流和向标准输出写入流。 从文件读取流和向文件写入流,需要用到fstream库。它定了三个数据类型 数据类型 描述 ofstream 该数据类型表示输出文件流,用于创建文件并向文件写入信息 ifstream 该数据类型表示输入文件流,用于
阅读全文
摘要:什么是线程 LWP:light weight process 轻量级的进程,本质仍是进程(在Linux环境下) 进程:独立地址空间,拥有PCB 线程:也有PCB,但没有独立的地址空间(共享) 区别:在于是否共享地址空间。 独居(进程);合租(线程)。 Linux下: 线程:最小的执行单位 进程:最小
阅读全文
摘要:C++程序中内存分为两个部分 栈:在函数内部声明的所有变量都将占用栈内存。 堆:这是程序中未使用的内存,在程序中可用于动态分配内存。 在很多时候,我们无法提前预知需要多少内存来存储某个变量的特定信息,所需内存的大小需要在运行时才能确定。 在C++中,可以使用特殊的运算符为给定类型的变量在运行时分配堆
阅读全文
摘要:按字面意思就是多种形态。当类之间存在层次结构,并且类之间通过继承关联时,就用到了多态。 C++多态意味着调用成员函数,会根据函数的对象的类型来执行不同的函数。 运行结果: exbot@ubuntu:~/wangqinghe/C++/20190812$ g++ polymorphic.cpp -o p
阅读全文
摘要:异常时程序在执行期间产生的问题。C++异常是指在程序运行时发生的特殊情况,比如尝试除以零的操作。 异常提供了一种转移程序控制权的方式。C++异常处理涉及到三个关键字:try、catch、throw l throw:当问题出现时,程序回抛出一个异常。这是通过使用throw关键字来完成。 l catch
阅读全文
摘要:守护进程 Daemon(精灵)进程,是Linux中的后台服务进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。一般采用以d结尾的名字。 Linux后台的一些系统服务进程,没有控制终端,不能直接和用户交互。不受用户登录、注销的影响,一直在运行着,他们都是守护进程。如:预读入缓输
阅读全文
摘要:创建会话 创建一个会话需要注意以下6点注意事项: getsid函数 获取进程所属的会话ID pid_t getsid(pid_t pid); 成功:返回调用进程的会话ID;失败:-1,设置errno pid为0表示察看当前进程session ID ps ajx命令查看系统中的进程。参数a表示不仅列当
阅读全文
摘要:类成员访问运算符(->)可以被重载,但它比较麻烦它被定义用于为一个类赋予“指针”行为。运算符->必须是一个成员函数。如果使用了->运算符,返回类型必须是指针或者是类的对象。 运算符->通常与指针引用运算符 * 结合使用,用于实现“只能指针”的功能,这些指针是行为与正常指针相似的对象,唯一不同的是,当
阅读全文
摘要:SIGCHLD的产生条件 子进程终止时 子进程接收到SIGSTOP信号停止时 子进程处在停止态,接受到SIGCONT后唤醒时 借助SIGCHLD信号回收子进程 子进程结束运行,其父进程会收到SIGCHLD信号。该信号的默认处理动作是忽略。可以捕捉该信号,在捕捉函数中完成子进程状态的回收。 分析该例子
阅读全文
摘要:/*** sync_process.c ***/ #include <stdio.h> #include <signal.h> #include <unistd.h> #include <stdlib.h> int n = 0, flag = 0; void sys_err(char *str) { perror(str); exit(1); } void do_sig_child(int num
阅读全文
摘要:pause函数 调用该函数可以造成进程主动挂起,等待信号唤醒。调用该系统调用的进程将处于阻塞状态(主动放弃cpu) 直到有信号递达将其唤醒。 int pause(void); 返回值:-1 并设置errno为EINTR 返回值: ① 如果信号的默认处理动作是终止进程,则进程终止,pause函数么有机
阅读全文
摘要:信号捕捉特性 练习1:为某个信号设置捕捉函数 【sigaction1.c】练习2: 验证在信号处理函数执行期间,该信号多次递送,那么只在处理函数之行结束后,处理一次。 【sigaction2.c】练习3:验证sa_mask在捕捉函数执行期间的屏蔽作用。 【sigaction3.c】 内核实现信号捕捉
阅读全文
摘要:sigaction函数 修改信号处理动作(通常在Linux用其来注册一个信号的捕捉函数) int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact); 成功:0;失败:-1,设置errno 参数:
阅读全文
摘要:信号集操作函数 内核通过读取未决信号集来判断信号是否应被处理。信号屏蔽字mask可以影响未决信号集。而我们可以在应用程序中自定义set来改变mask。已达到屏蔽指定信号的目的。 信号集设定 sigset_t set; // typedef unsigned long sigset_t; int si
阅读全文
摘要:signal函数 注册一个信号捕捉函数: typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t handler); 该函数由ANSI定义,由于历史原因在不同版本的Unix和不同版本的Linux中
阅读全文
摘要:alarm函数 设置定时器(闹钟)。在指定seconds后,内核会给当前进程发送14)SIGALRM信号。进程收到该信号,默认动作终止。 每个进程都有且只有唯一个定时器。 unsigned int alarm(unsigned int seconds); 返回0或剩余的秒数,无失败。 常用:取消定时
阅读全文
摘要:C++能够使用流提取运算符>>和流插入运算符<< 来输入输出内置数据类型,也可以重载流提取运算符和流插入运算符来操作对象等用户自定义的数据类型。 我们有时需要把运算符重载函数声明为类的友元函数,这样我们就能不用构造对象而直接调用函数。 运行结果: exbot@ubuntu:~/wangqinghe/
阅读全文
摘要:递增运算符(++)和递减运算符(--)是C++语言中两个重要的一元运算符。 运行结果: exbot@ubuntu:~/wangqinghe/C++/20190808$ g++ addMyself.cpp -o addMyself exbot@ubuntu:~/wangqinghe/C++/20190
阅读全文
摘要:重载赋值运算符(=),用于创建一个对象,比如拷贝构造函数。 运行结果: exbot@ubuntu:~/wangqinghe/C++/20190809$ g++ evaluate.cpp -o evaluate exbot@ubuntu:~/wangqinghe/C++/20190809$ ./eva
阅读全文
摘要:函数调用运算符()可以被重用于类的对象。当重载()时,没有创造一个新的调用函数的方式,相反地,这是创建一个可以传递任意数目参数的运算符函数。 运行结果: exbot@ubuntu:~/wangqinghe/C++/20190809$ ./bracket First Distance : F: 11
阅读全文
摘要:重载该运算符用于增强操作C++数组的功能。 运行结果: exbot@ubuntu:~/wangqinghe/C++/20190809$ g++ subscript.cpp -o subscript exbot@ubuntu:~/wangqinghe/C++/20190809$ ./subscript
阅读全文
摘要:产生信号五种方法: 信号四要素: 编号、名称、事件、默认处理动作 信号的处理方式: Linux内核的进程控制块PCB是一个结构体,task_struct除了包含进程id,状态,工作目录,用户id,组id,文件描述符,还包含了信号相关的信息,主要指阻塞信号集和未决信号集。 阻塞信号集(信号屏蔽字):将
阅读全文
摘要:kill函数/命令产生信号 kill命令产生信号:kill -SIGKILL pid kill函数:给指定进程发送指定信号(不一定杀死) int kill(pid_t pid, int sig); 成功:0;失败:-1 (ID非法,信号非法,普通用户杀init进程等权级问题),设置errno sig
阅读全文
摘要:C++语言支持各种关系运算符重载(<,>,>=,<=,==),他们可用于比较C++内置的数据类型。 支持重载任意一个关系运算符,重载后的关系运算符可以用于比较类的对象。 运行结果: exbot@ubuntu:~/wangqinghe/C++/20190808$ ./overrelation D2 i
阅读全文
摘要:一元运算符只对一个操作数进行操作,下面是一元运算符实例: 运算结果: exbot@ubuntu:~/wangqinghe/C++/20190808$ g++ overone.cpp -o overone exbot@ubuntu:~/wangqinghe/C++/20190808$ ./overon
阅读全文
摘要:以非成员函数方式重载运算符 运算结果: exbot@ubuntu:~/wangqinghe/C++/20190808$ g++ overtwo.cpp -o overtwo exbot@ubuntu:~/wangqinghe/C++/20190808$ ./overtwo Volume of box
阅读全文
摘要:C++允许在同一个作用域中的某个函数和运算符指定多个定义,分别称为函数重载和运算符重载。 重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明,但他们的参数列表和定义(实现)不相同。 当调用一个重载函数或重载运算符时,编译器通过把函数所使用的参数类型和定义中的参数类型进行比较,
阅读全文
摘要:/* * 后执行,尝试读取另外一个进程写入文件的内容 */ #include #include #include #include #include int main(void) { char buf[1024]; char *str = "----------test2 write secesuss--------\n"; int ret; s...
阅读全文
摘要:mmap()函数: void *mmap(void* addr,size_t length,int port,int flags,int fd,off_t offset); 返回:成功:返回创建的映射区首地址;失败:MAP_FAILED 宏 参数: addr: 建立映射区的首地址,由linux内核决
阅读全文
摘要:运行结果: ubuntu1604@ubuntu:~/wangqinghe/C/20190805$ ./fork_test xxxxxxxx I'm parent,pid = 2610, ppid = 2558 I'm child,pid = 2611,ppid = 2610 YYYYYYYYYYY
阅读全文
摘要:C++内联函数通常是跟类一起使用。如果一个函数是内联的,那么在编译时,编译器会把该函数的代码副本放在每个调用该函数的地方。对内联函数进行任何修改,都需要重新编译函数的所有客户端,因为编译器需要重新更改一次所有的代码,否则将会继续使用旧的代码。 如果想把一个函数定义为内联函数,需要在函数名前面放关键字
阅读全文
摘要:我们可以使用static关键字把类成员定义为静态的。当我们声明类的成员为静态时,这意味着无论创建多少个类的对象,静态成员都只有一个副本。 静态成员在类的所有对象都是贡献的。如果不存在其他的初始化语句,在创建第一个对象时,所有的静态数据都会被初始化为0。我们不能把静态成员的初始化放置在类的定义中,但是
阅读全文
摘要:在C++中,每一个对象都能够通过this指针来访问自己的地址。this指针是所有成员函数的隐含参数。因此,在成员函数内部,它可以用来指向调用对象。 友元函数是没有this指针的,因为友元不是类的成员,只有成员函数才有this指针。 运行结果: exbot@ubuntu:~/wangqinghe/C+
阅读全文
摘要:类的友元函数是定义在类外部,但有权访问类的所有私有成员和保护成员。尽管友元函数的原型有在类的定义中出现过,但友元函数并不是成员函数。 友元可以是一个函数,该函数被称为友元函数;友元也可以是一个类,该类被称为友元类。在这种情况下,整个类及其所有成员都是友元。如果要声明函数为一个类的友元,需要在类定义中
阅读全文
摘要:孤儿进程:父进程先于子进程结束,则子进程成为孤儿进程,子进程的父进程成为init进程,称为init进程领养孤儿进程。 僵尸进程: 进程终止,父进程尚未回收,子进程残留资源(PCB)存放于内核中,变为僵尸进程。
阅读全文
摘要:waitpid函数 作用同于wait,但可指定pid进程清理,可以不阻塞。 pid_t waitpid(pid_t pid,int *status,int options);成功:返回清理掉的子进程ID;失败:-1(无子进程) 特殊参数和返回情况: 参数pid: >0 回收指定ID的子进程 -1 回
阅读全文
摘要:wait()函数:回收僵尸进程 父进程调用wait函数可以回收子进程终止信息。该函数有三个功能: 1) 阻塞等待子进程退出 2) 回收子进程残留资源 3) 获取子进程结束状态(退出原因) pid_t wit(int *status); 成功:清理掉的子进程ID;失败:-1(没有子进程) 当进程终止时
阅读全文
摘要:将当前系统中的进程信息打印到文件中 命令行:ps aux > out 将ps得到的信息重定向到out文件中 使用dup2文件在程序中完成。 运行结果: ubuntu1604@ubuntu:~/wangqinghe/linux/20190806$ ls -l ps.out -rw-r--r-- 1 u
阅读全文
摘要:fork()函数生成的子进程只能运行与父进程相同的代码函数,如果想要子进程执行另外一个程序,需要用到exec族的函数,如下: execlp()函数 运行结果: ubuntu1604@ubuntu:~/wangqinghe/linux/20190806$ ./execlp 总用量 28 drwxrwx
阅读全文
摘要:父子进程共享打开的文件描述符 使用文件完成进程间通信. 运行结果: ubuntu1604@ubuntu:~/wangqinghe/linux/20190806$ ./fork_share_fd child wrote over... test for shared fd in parent chil
阅读全文
摘要:进程间完成数据传递需要借助操作系统提供的特殊的方法,比如:文件、管道、信号、共享内存、消息队列、套接字、命名管道等。但现在常用的进程间通信方式有: 管道 – 使用最简单 pipe 管道一般读写行为 FIFO(有名管道): 用于非血缘关系进程间通信 信号 – 开销最小 共享映射区 – 无血缘关系 nm
阅读全文
摘要:拷贝构造函数是一种特殊的构造函数,它在创建对象时,使用的是同一类中之前创建的对象来初始化新创建的对象。拷贝构造函数通常用于: l 通过使用另一个同类型的对象来初始化新创建的对象; l 复制对象把它作为参数传递给函数; l 复制对象,并从函数返回这个对象。 如果类中没有定义拷贝构造函数,编译器会自行定
阅读全文
摘要:类的构造函数: 类的构造函数是类的一种特殊的成员函数,它会在每次创建类的新对象时执行。 构造函数的名称与类的名称是完全相同的,并且不会返回任何类型,也不会返回void。 构造函数可用于为某些成员变量初始值。 默认的构造函数是没有任何参数的,但是如果需要,构造函数也是可以带参数的。这样在创建对象时就可
阅读全文
摘要:输入输出流函数(模板) 运行结果: exbot@ubuntu:~/wangqinghe/C++/time$ ./cout 123.46 ****123.46 999.123 1.235e+02 cout.self和setiosflags一样,cout.precision和setprecision一样
阅读全文
摘要:C++继承了C语言用于日期和时间操作的结构和函数,使用之前程序要引用<ctime>头文件 有四个与时间相关的类型:clock_t、time_t、size_t、和tm。类型clock_t、size_t、和time_t能够把系统时间和日期表示为某种整数。 结构体tm把时间和日期以C结构的形式保存,tm结
阅读全文
摘要:不同系统会有不同差异: 类型 位(byte) 范围 char 1 -128—127 or 0 – 255 unsigned char 1 0 – 255 signed char 1 -128—127 int 4 -2^31 – 2^32-1 unsigned int 4 0 – 2^32 signe
阅读全文
摘要:枚举类型: 枚举类型(enumeration)是C++的一种派生数据类型,它是由用户定义的若干枚举常量的集合。 如果一个变量只有几种可能的值,可以定义为枚举类型所谓枚举是将变量一一枚举出来,变量的值只能在列举出来的值的范围内。 创建枚举,需要使用关键字enum枚举类型的一般形式为: enum 类型
阅读全文
摘要:C中包含头文件<math.h> C++包含头文件<cmath> 函数 double cos(double) 该函数返回弧度角(double型)的余弦 double tan(double) 该函数返回弧度角(double型)的正切 double sin(double) 该函数返回弧度角(double型
阅读全文
摘要:C++输出十六进制 运行结果: exbot@ubuntu:~/wangqinghe/C++/enum$ ./mybyte a : hex 3c b : hex d c : hex c C++输出二进制: 运行结果: exbot@ubuntu:~/wangqinghe/C++/enum$ ./binb
阅读全文
摘要:字符串函数:(C/C++通用) 函数 功能 strcpy(s1,s2); 复制字符串s2到s1 strcat(s1,s2) 连接字符串s2到字符串s1末尾 strlen(s1) 返回字符串s1的长度 strcmp(s1,s2) 如果s1和s2相同返回0 如果s1 < s2,返回值小于0 如果s1 >
阅读全文
摘要:在平时使用中,可以使用以下的makefile来编译单独的代码 使用方法就是make 后面跟文件名就可以单独编译该程序(不要加后缀.c) 更正: 上面的makefile无法实现make clean删除执行文件的原因是 代码错误。 以下是可以生成并且删除对应的文件
阅读全文
摘要:getenv获取环境变量值的函数; setenv改变或者添加环境变量函数; unsetenv 取消环境变量; (可以在终端上man 函数名来获取详细的函数信息) 运行结果: ubuntu1604@ubuntu:~/wangqinghe/C/20190805$ gcc setenv.c -o sete
阅读全文
摘要:常见环境变量 按照惯例,环境变量字符串都是name=value这样的形式,大多数name由大写字母加下划线组成,一般把name的部分叫做环境变量,value的部分则是环境变量的值。环境变量定义了进程的运行环境,一些比较重要的环境变量的含义如下: PATH 可执行文件的搜索路径。ls命令也是一个程序,
阅读全文
摘要:进程控制块PCB 我们知道,每个进程在内核中都有一个进程控制块(PCB)来维护进程相关的信息,Linux内核的进程控制块是task_struct结构体。 /usr/src/linux-headers-3.16.0-30/include/linux/sched.h文件中可以查看struct task_
阅读全文
摘要:Makefile 命令 1、第一条规则是用来生成终极目标的规则 如果规则中的依赖不存在,向下寻找其他的规则 更新机制:比较的是目标文件和依赖文件的时间 1)查找指定目录下,指定类型的文件 src = $(wildcard ~/aa/*.c) 2) 匹配替换函数 obj = $(patsubst %.
阅读全文
摘要:gdb命令: 取消变量追踪:undisplay 编号 获取编号:info display 手动打印变量值: print – p 获取变量对应的类型:ptype
阅读全文
摘要:命令方式: makefile 或 Makefile makefile规则: 目标,依赖,命令 目标:依赖条件 命令 版本1: 版本2: makefile工作原理: 版本3: makefile中自动变量 $<:规则中的第一个目标 $@:规则中的目标 $:规则中所有的依赖 只能在规则的命令中使用 Mak
阅读全文
摘要:gdb启动 gdb 程序名 l 查看源代码(默认显示十行) l 文件名:行数 l 文件名:函数名 添加断点 break + 行数 (b 也行) b 15 if i == 15 条件断点 i b 查看断点信息 start 程序执行一步 n 单步调试 s 单步(能进到函数体内部) c 运行到断点 s 进
阅读全文
摘要:命令规则 lib + 名字 + .so 制作步骤 1)生成与位置无关的代码(生成与位置无关的代码) 2)将.o打包成共享库(动态库) 发布和使用共享库 动态库运行原理: 生成动态库: gcc -fPIC -c *.c -I ./include 打包动态库并移动 使用动态库: ubuntu1604@u
阅读全文
摘要:命名规则: lib + 库的名字 + .a 制作步骤 生成对应.o文件 .c à .o 将生成的.o文件打包 ar rcs + 静态库的名字(libMytest.a) + 生成的所有的.o 发布和使用静态库: 1) 发布静态 2) 头文件 文件如下图所示: 1) 生成对应的.o文件 2) 将所生成的
阅读全文
摘要:man 查看帮助文档 alias ls : 查看命令是否被封装 echo : 显示字符串到屏幕终端 echo $PATH : 将环境变量打印出来 poweroff:关机 rebot:重启 需要管理员权限 vim是从vi发展过来的文本编辑器 命令模式:打开文件之后默认进入命令模式 编辑模式: 末行模式
阅读全文
摘要:程序中可以使用#ifdef来控制输出信息 这样在有宏定义DEBGU的时候就会有信息输出 如果注销掉宏定义就不会有输出信息。 也可以注销掉宏定义后,在编译时加上-D gcc debug.c -o debug -D DEBUG 同样可以达到效果 这样的方案是为了解决很多文件有宏定义输出信息的需求
阅读全文
摘要:mount :设备名 挂载路径 sudo fdisk -l 查看磁盘设备名 sudo mount /dev/sdb1 /mnt sudo umount /mnt 卸载mnt(不能再卸载目录中) 压缩: gzip *.txt (将所有.txt源文件分别压缩.gz压缩包) gunzip 解压缩 bzip
阅读全文