自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

进击的小学生

To be or not to be, this is a question.

  • 博客(34)
  • 资源 (10)
  • 论坛 (1)
  • 收藏
  • 关注

原创 48-信号大结局

信号这个专题花了太长的篇幅,也可能是目前你学的最累的一次,实验也非常多。这篇文章就帮我们理一理整个信号的脉络。信号专题总结从理解进程能够接收信号开始,就探讨了进程对信号做出的默认动作。接下来我们开始引入ANSI C提供的 signal 信号注册函数,帮助我们自己处理信号。掌握了信号处理函数,你就可以使用异步的方式处理子进程先行退出的情况了(SIGCHLD)。同时我们演示了信号的不可靠性,意思是说如果

2016-12-30 09:43:21 1022

原创 49-进程通信初步

错综复杂的信号专题终于结束,能写到这里,感觉真不容易,甚至有点小激动,因为接下来进入进程间通信这个老生常谈的大专题。希望能有信心写好,因为我自己也有很多地方没有弄清晰,希望借此笔记来提升一下自己。进程间通信,指的是不同的进程间进行交流,本质上就是进程之间发送和接收数据。本质上,信号也是属于进程间通信的一种,只不过信号这一块的内容实在是太多,所以自成一体了。作为进程通信的初步,我并不想以“管道通信”开

2016-12-29 21:46:01 1797 1

原创 47-跳出信号处理函数

相信你对 longjmp 已经无比熟练了,有没有想过,使用它从信号处理函数跳出来?不过在这之前,我们有几件事情需要确定下来。在信号处理函数执行时,会阻塞当前信号。当信号处理函数返回时,系统会帮我们把刚刚阻塞的信号再从阻塞集中移除。接下来,就是验证上面的陈述了。1. 临时阻塞特性当执行信号处理函数的时候,会临时将当前被处理信号阻塞。为了能说明问题,采用实验来验证。下面这段程序在收到 SIGALR

2016-12-29 15:14:40 1178

原创 46-打造自己的 longjmp

对于 longjmp 这种不走常规路线的迷一样的函数,到底是如何实现的呢?也许从你学习 C 语言以来你都不知道代码还可以这么写。其实,一切都是套路。通常来说,编译器为我们编译的函数,都是按正常套路来走的。这意味着,如果你用 C 语言编写函数,就会被编译器给套路掉。所以,这种不按套路走的函数,我们只能用汇编语言写了。为能能写出这种函数,需要掌握函数栈帧结构。1. 函数栈帧1.1 基本概念熟悉 C 语言

2016-12-28 22:11:47 2458 2

原创 45-超越 goto 的跳转 longjmp

不明所以的同学可能觉得本篇和信号这一专题关系不大,实际上,本篇是为 sigsetjmp 和 siglongjmp 函数作铺垫。但是在这讲这两函数前,先学习更简单的 setjmp 函数和 longjmp 函数。1. 回忆 goto回忆 C 语言中的 goto 语句,它所起到的作用就直接从一条语句跳转到另一条语句。这种程序往往破坏了程序的结构,所以专家们都不提倡使用 goto 语句,不过这个我们并关心,

2016-12-28 15:24:48 1079

原创 44-中断系统调用与自动重启动

经历了大量的代码实践,每每我们在 main 函数中都有这么类似的一句:while(1) { write(STDOUT_FILENO, ".", 1); sleep(...); // read(...), pause(...)}有时候,只要发现信号一来,这后面的 sleep 或者 pause 被信号中断后都会失效。不过你还没见过 read 也失效的情况,那是因为之前我们一直用的 signa

2016-12-28 10:55:25 2282 2

原创 43-打通你的任督二脉-信号处理函数的执行期

可能有些同学会对信号处理函数是如何被操作系统调用的十分感兴趣,当然也有一部分同学不感兴趣的你可以跳过此篇啦。本文可能会涉及一些内核,x86 保护模式相关的知识,所以要求还是蛮高。不过我会尽量用最朴素的语言讲清楚。在这之前,有些概念需要简单的提一下。1. 系统调用当你使用系统调用的时候,一般就意味着你要进入操作系统内核了。比如 write 函数,read 函数,再比如 sigaction 函数等等。基

2016-12-27 18:32:03 2819

原创 42-带参数的信号

前面不管我们是使用 signal 信号注册函数还是 sigaction 信号注册函数,我们都只注册了带一个参数的信号处理函数 void handler(int sig)。实际上,我们也可以使用带参数的的信号处理函数。signal 函数没办法注册一个带附加参数的信号处理函数,但是 sigaction 可以。具体是通过 sigaction 的第二个参数 struct sigaction 结构体来指定带附

2016-12-27 11:58:50 2194

原创 41-新的信号注册函数 sigaction

在这之前,我们一直使用 signal 来注册信号处理函数,而且一开始我甚至都没有提起过甚至 signal 还有一个兄弟——sigaction. 我相信,把 sigaction 放到这里是适合的,因为你已经具备了足够的基础去理解它了。1. sigaction 函数不同于 signal 函数,sigaction 函数是符合 POSIX 标准的,而 signal 只是 ANSI C 标准函数。除了上面的区

2016-12-26 18:10:38 1945 4

原创 40-阻塞信号与未决信号

有时候,你并不希望你的进程处理信号。比如接收到 SIGINT 后对它置之不理。linux 提供了一个函数 sigprocmask 来帮助我们实现此功能。在一个进程中,保存了两个信号集(在PCB中),分别是阻塞信号集,还有一个未决信号集。当你使用 sigprocmask 的时候,就会修改阻塞信号集。有关未决信号集请本文看第 2 节。如果一个信号加加入阻塞信号集,该信号的信号处理函数就不会被调用。1.

2016-12-26 16:51:05 1821

原创 39-装信号的容器 sigset

看到这个标题有同学会产生一些疑问(手动黑人问号),信号能被装进容器吗?答曰:能。为什么需要容器来装信号?其实还是方便 linux 内核处理信号,当然也方便用户程序处理。试想一下,如果同时发送了好多不同的信号给进程,然而进程一次只能处理一个信号,所以进程得把接收到的信号先保存起来才行。1. sigset_tPOSIX 定义一个数据结构 —— sigset_t ,从名称也可以看出这是通过 typedef

2016-12-26 14:40:36 2043

原创 38-启动定时炸弹 alarm

除了能够使用 kill 函数发信号,本篇再学习一个很重要的信号发送函数 alarm. 该函数不像 kill 函数可以给其它进程发送信号,它只能给自己发信号。另外,它只能发送 SIGALRM 信号。有同学会问,那要它何用?还不如用 kill 函数呢。其实,alarm 的强大之处在于它可以做到多少秒后发送消息——感觉像极了定时炸弹(不用担心,你的电脑不会爆炸)。1. alarm 函数unsigned i

2016-12-26 11:43:15 1384

原创 37-使用 kill 函数发送信号

一直以来,我们给程序发送信号都是通过快捷键(Ctrl+C, Ctrl+Z, Ctrl+\) 或者使用系统命令kill来向进程发送信号(还有一种是系统给你发送的信号,比如 SIGCHLD、SIGSEGV 等等)。除此之外,也可以通过函数 int kill(pid_t pid, int sig) 来向进程发送信号。kill 函数是 POSIX 定义的。实际上还有一个函数名为 raise,它是 ANSI

2016-12-24 13:31:38 2474 1

原创 36-可重入函数

这一篇,大家可以轻松下了。本篇的压力相对来说比较小。如果你编写过多线程程序,相信你听说过线程安全的函数,本质上讲线程安全的函数是不可重入函数。如果你从未接触过这个概念,也没什么关系。1. 何为可重入不妨看下面的一个函数。int a = 0; // 全局变量int fun() { ++a; return a;}试想一下,当你在执行 fun() 函数的 return a 的时候(假设这时候 a

2016-12-23 18:05:52 1469 2

原创 35-标准信号及其不可靠性

信号你会发了,也会捕了,但是还有好些个坑没填上。之前一直强调发送信号 1 - 31 号,实际上,还有 32-64 号信号。为什么不发 32-64 号信号,是因为32-64号和前面的 1- 31 号不属于一个范畴。1-31号,被规定为 standard signals,也就是标准信号。32-64号信号,被规定为 real-time signals,也就是实时信号。目前我们只关心标准信号,而不关心实时信

2016-12-23 17:30:10 1795 7

原创 34-招待你的“客人”

对于进程来说,信号就像它的客人。客人来了,进程没好好执行它,那么客人会很生气,后果很严重。比如你发送信号 1 信号 2 给进程,直接导致进程退出。客人来你家了,如果你不理会,导致的就是你家被毁(^_^客人还是挺牛逼的)。本篇学习一个标准 C 库的函数 signal,这个函数,可以帮助我们执行指定的客人。1. 如何招待按照规则编写信号处理函数使用 signal 函数安装你刚刚编写的信号处理函数,同

2016-12-23 11:33:52 1855 2

原创 33-Hello signal

进程初步已经结束,不过有关进程的知识点还有太多太多,有关进程的其它知识暂且往后挪。你也知道,你已经不止一次遇到信号这个陌生又熟悉的词语了。而且信号和进程,本来就是相互掺和在一起。所以,从这一篇开始,我们对信号说 hello.1. hello signal 程序如果你第一次学习 hello world 一样,这里写一个简单的 hello signal 程序。我的目的是希望借助 hello signal

2016-12-22 14:55:24 1747

原创 32-wait大变身之waitpid

上一篇,介绍了僵尸进程的概念,也学会了用 wait 清除它。实际上,wait 函数的本质并不是为清除僵尸进程而存在,而是为了获取子进程状态。只要子进程的状态发生了改变,它就会给父进程发信号。比如子进程暂停执行,会告诉父进程:爹,我暂停了(SIGSTOP),如果又恢复执行了,又会告诉父进程:爹,我恢复执行了(SIGCONT)。这些信号,父进程都可以忽略,没什么关系。只是当子进程给父进程发送正

2016-12-21 10:32:14 1840 4

原创 31-wait 大战僵尸

按照正常的逻辑,应该讲讲 vfork 的(专为 exec 而定制)。不过鉴于 vfork 现在已经很少使用了,而且现在的 fork 也完全可以替代 vfork,所以讲 vfork 有点重复的意思。当然了不排除面试或者考试会有人问到 vfork,这里稍微提两笔。vfork 采用了类似读时共享的机制,但是其不保证写时复制,它产生的子进程和父进程共享进程空间,所以,如果在 vfork 后没有使用 exec

2016-12-20 14:50:29 1972 4

原创 30-换个姿势执行 ls 命令

本来本文的名字叫 《exec 系列函数》。可是想了想,exec 系列的函数有 6 个,实在是太多,而且功能也一样,实在没必要一一讲解。exec 系列函数的目的,就是把本进程空间的代码和数据全部替换成你指定的数据,然后从新程序的入口点开始执行。本篇只介绍其中一个函数——execvp.这里解释一下,函数名中的 v 代表 vector,表示参数是数组。p 代表 path,表示如果你指定的文件不包含路径,就

2016-12-19 22:03:07 2319

原创 29-fork 函数与文件共享

不知道大家考虑过这样的问题没:如果进程在 fork 之前打开了一些文件,那么 fork 完之后,这些文件的描述符是共享的,还是不共享的?聪明的同学阅读了上篇《进程空间》的相关内容,脑子应该立即反应过来:父子进程的进程地址空间都是隔离的啊!所以打开的文件,应该也互不影响吧!No! No! No! 很抱歉,上一篇我的确讲过进程空间是隔离的。为了循序渐近和压缩篇幅,我不得不相关内容挪到此篇。进程 4GB

2016-12-19 16:07:30 1902

原创 28-进程空间与 fork 函数原理

前面对 fork 函数牛刀小试,相信你已基本掌握了简单的“影分身术”了,不过在篇末,却为各位留下了一些坑位。为了能够说明白一些问题,本篇将讨论有关进程的一些必备知识,以及 fork 函数的底层实现。如此一来,也方便加深对其它有关问题的理解。当然,如果你对此完全不感兴趣,大可跳过。本文所讨论的范围,限制在 32 位的 linux 操作系统。1. 进程空间这里的进程空间,说的就是进程虚拟地址空间。稍微懂

2016-12-18 20:49:18 2928 3

原创 27-fork 函数与分身术

初步体验进程的概念后,你也知道了你的 a.out 进程实际上是由终端 bash 进程创造出来的。那 bash 进程的父进程又是谁呢?如果你不断追溯下去,你就会发现,最终于那个进程就是 pid 为1 的 init 进程,而 init 进程,又是由一个 pid 为 0 的进程通过系统调用 fork 生成的,它也是第一个由 fork 函数创造出来的进程(linux 0.11 内核)。fork 是本篇的重点

2016-12-18 16:41:44 2288 1

原创 26-感受进程

当你编译完一段代码生成 a.out 后,在命令行键入 ./a.out,这时候,就有一个(或多个)新的进程产生了(前提你的 a.out 没问题^_^).在此之前,a.out 文件只是一份保存在你硬盘上的死物而已,它并不是进程。一旦你在你的终端里键入./a.out,你的终端 shell(它也是个进程,一个活物) 就会把 a.out 文件读到内存,一旦把控制权交给内存中的这段 a.out (称之为内存映像

2016-12-13 14:40:06 1980

原创 25-文件与目录总结

到这里,文件系统相关的知识基本上算告以段落。博客所讲述的远远只是文件与目录中的一部分,不可能面面俱到。这一篇将文件与目录相关的内容进行梳理,可以对照着看看,还有哪些知识点没搞清楚。其中重要的部分已经加粗,一定要重点掌握和理解。当然,其它知识点也是相当重要的。文件系统dir_entry 结构体inode 结构体stat 函数st_mode 字段的结构以及 chmod 函数chown 函数

2016-12-05 20:48:05 909

原创 24-与目录有关的函数-读取目录

这一篇将非常重要,这里介绍的函数可以帮助我们通过写程序来遍历目录。需要重点掌握 4 个函数 opendir、readdir、rewinddir 和 closedir。其实还有两个不怎么重要的函数 seekdir 和 telldir,它似乎没有太大用处,而且很少能用上,感兴趣的同学可以自己查阅 man 手册。这些函数都是 glibc 提供的函数,也就是说它们并不是一个系统调用。在学习它们的时候,我们应

2016-12-04 21:17:54 1038 2

原创 23-与目录有关的函数-mkdir 与 rmdir

mkdir 是用来创建一个空目录的,而 rmdir 用来删除空目录。与 linux 命令的 mkdir不同的是,mkdir 函数需要指定目录的权限位。想必你已经对 mode 相当熟悉了。不过,对于目录来说,权限位还有一些坑,也没那么容易。1 目录的权限位目录的权限位,至少要设置一个执行许可位。即 rwx 中的那个 x 位。如果不设置,就没办法使用 cd 命令进入目录,也无法读取目录下的文件内容。所

2016-12-04 18:13:00 1115

原创 22-与目录有关的函数-chdir 与 getcwd

chdir 这个命令类似于 linux 的命令 cd,而 getcwd 有点像 pwd。1 先入为主也许你自认为对 cd 命令和 pwd 命令相当熟悉了,那么,先看下面的例子。1.1 代码函数原型int chdir(const char *path);char *getcwd(char *buf, size_t size);实例这段代码的目的是实现一个类似 cd 的命令,同时打印 cd 后

2016-12-03 22:22:47 1187

原创 21-link系列的函数

link 系列的函数,主要是用来创建链接,删除链接的。主要有 link、symlink、unlink、readlink 这几个。它们的功能如下: 函数 功能 link 创建硬链接 symlink 创建软链接(符号链接) unlink 删除硬链接或软链接 readlink 读取软链接文件自身内容(不是所指向的文件内容)1 实例在此之前先创建测试文件 test.t

2016-12-02 14:51:14 1000

原创 20-硬链接与软链接

首先,我们要理解的一个概念是:什么是链接?链接是一个传送门。当你使用 vim 打开一个链接的时候,看到的内容是链接所指向的内容。当你使用 cat 后面加一个链接的时候,实际打印的也是链接所指向的内容。linux 为我们屏蔽了很多细节,让我们感觉,操作链接,好像是在操作原始文件一样。既然如此,为什么还区分硬链接和软链接?它们的区别在哪里?1 回忆 dir_entry如果你不知道什么是 dir_entr

2016-12-01 23:05:53 1505 2

原创 19-文件截断与 truncate 函数

所谓的截断,就是把一个文件的尾部砍掉。truncate 函数可以非常容易的做到这一点。它的原型如下:int truncate(const char *path, off_t length);1 truncate 函数示例下面给一个简单的示例来说明。这段代码的功能是将指定文件截断成固定长度。代码// 文件名: mytruncate.c#include <unistd.h>#include <s

2016-12-01 18:31:17 3192

原创 18-utime 函数

utime 函数可以用来更改文件的最近访问时间和最近修改时间,即 atime 和 mtime。如果你不知道这两个时间是什么含义,请参考《stat 结构体中的三个时间》 。1 utime 函数原型/*struct utimbuf { time_t actime; // access time time_t modtime; // modification tim

2016-12-01 17:44:07 1111 2

原创 17-chown 函数

如果你对 linux 中的命令 chown比较熟悉的话,学起 chown 函数也会格外轻松。chown 命令只能工作在 root 权限下,主要用来修改文件的所有者和所属组。1 chown 命令下面以实例简单讲解下 chown 的使用方法。当前登录的账号是 allen.创建测试文件$ touch test.txt$ ls -l test.txt-rw-rw-r-- 1 allen allen

2016-12-01 16:55:19 1439

原创 16-st_mode 与 chmod 函数

在 《13-stat 结构体 st_mode 字段 》一文中,已经 hin 详细的介绍了 st_mode 字段。作为一名 linux 编程人员,记住 st_mode 的结构也是一项拿不上什么台面的基本技能。倘若你对 st_mode 很熟了,chmod 函数就太 easy 了。1 chmod 函数什么的?stat 函数想必你已经非常熟了,想想这个函数是从哪里获取到 st_mode 的值的?如果你还

2016-12-01 10:17:34 1515

EasyDraw 3.0(事故树绘制)

EasyDraw 事故树软件,3.0 版本,完全免费。排版更加精致,支持生成 svg 矢量图,png/jpeg 图形。

2018-11-02

梯度下降法VS2008_C++

梯度下降法完整的VS2008代码。博客地址:http://blog.csdn.net/q1007729991/article/details/40382071

2014-10-23

事故树绘制软件easydraw免费V2.19

免费版本的事故软件,实现所有计算功能,节点自动调整,建树判错等功能!支持导出图片。

2013-12-13

GCC 内联汇编

gcc 内联汇编 1 AT&T 与 INTEL 的汇编语言语法的区别 1.1 大小写 1.2 操作数赋值方向 1.3 前缀 1.4 间接寻址语法 1.5 后缀 1.6 指令 2 GCC 内嵌汇编 2.1 简介 2.2 内嵌汇编举例 2.3 语法 2.3.1 汇编语句模板 2.3.2 输出部分 2.3.3 输入部分 2.3.4 限制字符 2.3.5 破坏描述部分 2.4GCC 如何编译内嵌汇编代码

2018-10-28

版本控制之道-使用 Git

程序员修炼三部曲第一部,Travis Swicegood 著,董越、付昭伟等译

2018-10-28

事故树绘制分析软件

简单易用,功能其全的一个事故树绘制分析软件,用以计算最小割集,最小径集,顶上事件概率,概率重要度,结构重要度,临界重要度,计算方法可选。 计算的结果可以保存到本地txt文本文件,方便您复制到您需要的地方,给您的论文写作也会带来极大方便。概率计算提供一套精确算法,可以根据您所提供的数据计算出精确结果。当然您也可以选择近似算法,本软件提供首项近似法和平均近似法的计算结果,给您多种选则。软件非常简单易用,自己几分钟就可以学会,谢谢您的使用!

2012-12-17

增强版事故树绘制与分析程序

1.完善建立事故树的过程 2.事故树节点自动排列,免去手工排列节点的烦恼 3.编号自动生成,免去手工编号的繁琐 4.自动检测是否有闭环回路,防止用户建立逻辑上错误的事故树 5.自动检测用户是否在一个事件下重复添加 6.相同事件下建立节点,会进行同步复制,提高建树效率 7.相同事件下删除节点,会进行同步删除 8.手工拖动节点时自动对齐 9.修改节点信息,所有相同节点进行同步修改 10.画布大小自定义 11.画布颜色,事件框颜色,门颜色,文字颜色可以自定义 12.完美的一键保存bmp图片功能 13.编码树与文字树一键切换 14.列出事件清单,方便用户一次性输入事件概率 15.完善顶上事件概率计算,提供最小割集逼近法,无重复基本事件计算法,首项近似法,以及事件状态组合法。 16.优化最小割集、径集算法,提高计算速度 17.结构重要度删除不必要的状态组合法,仅提供公式三计算结果 18.提高了概率重要度、关键重要度的计算精度

2013-04-19

汇编_单片机_matlab_Multisim等

注意:此为TXT文档,里面都有下载地址,你所要下载的东东都在我的u115网盘里! 静态反汇编工具W32Dasm.rar 51单片机种子全.rar win7系统工具.rar matlab详细教程.rar Multisim教程.exe 中国象棋经典残局《适情雅趣》_0.1.exe UltraEdit-32_V16.20.0.1009_汉化版(30天免费使用).exe 精美PPT模板_2009.11.30.zip VC6.0简体中文企业版.rar

2010-11-24

MFC 音乐播放器

基本上实现了常用的播放功能,可以自动下一首,通过音量条控制音量,实现时间进度栏,实现将添加到列表的歌曲文件列表存储到本地,下次启动的时候依然还在,更多功能等待你的发觉,不要说分高,学习才是王道,尊重作者的劳动成果,花了两天时间写的。

2012-12-12

k近邻_kd-tree_kd树_vs2008_C++代码

vs2008写的Kd树泛型算法,支持k近邻查询。

2014-12-15

--Allen--的留言板

发表于 2020-01-02 最后回复 2020-01-02

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人 TA的粉丝

提示
确定要删除当前文章?
取消 删除