自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(35)
  • 收藏
  • 关注

原创 【线程】--------认识死锁

一、死锁1)提出 多线程与多进程提高了系统资源的利用率,然而并发执行也会带来一些问题,如死锁。 2)概念 死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。 3)死锁在现实生活中的实例 在一个计算机系统中,只有一个打印机和一个...

2018-04-29 23:16:50 269

原创 线程控制(一)------线程的创建与终止

引言: 我们先在学的线程都是用户级库线程(POSIX),我们通过基本的学习认识到了与线程有关的函数构成了一个完整的系列,绝大多数的函数的名字都是以“pthread”打头的,在使用这些函数的时候引入的头文件是一、创建线程pthread_create函数 错误检查:常见的函数,成功返回0,失败返回-1,并且对全局变量errno赋值以指示错误 -pthreads函数出错时不...

2018-04-29 20:04:43 265

原创 gdb调试多进程程序

默认设置下我们在调试多进程程序时gdb志愿汇调试主进程,但是gdb(>v7.0)支持多进程的分别以及同时调试,换句话说,gdb可以同时调试多个程序。只需要设置follow-fork-mode(默认值:parent)和detach-on-fork(默认值:on)即可。 follow-fork-mode和detach-on-fork说明: follow-fork-mode de...

2018-04-29 19:07:27 201

原创 线程的基本概念

一、 线程的概念, 总结Linux下线程有什么特点。 1)什么是线程在一个程序里的一个执行路线就叫做线程(thread)更准确的定义就是“线程就是一个进程内部的控制序列”。线程是在进程内部运行的执行流(线程在进程的地址空间)。一切进程至少有一个执行线程Linux没有真正的线程,用进程模拟线程,linux下的进程称为轻量级进程线程是调度的基本单位 2)进程和线程 线程...

2018-04-28 23:51:23 686

原创 【数据结构】------多通路带环迷宫求最短路径(C语言)

思路:在解决之前的函数时,我们判断函数是否可以落脚,标记可落脚的函数都是通用的,而现在由于迷宫的通路是带环的,如果我们在使用上面提到的不带环的多通路求最短路径的方法,肯定这种结果是错误的,所以对于带环的迷宫求解我们再也不能像以前简单的标记为2,我们应该标记的是走过的步数,这样我们判断是否能落脚时,可以直接判断下一步的步数是否比我们即将标记的步数大,如果大的话,就继续进行落脚标记,否则就不可以。...

2018-04-28 23:37:06 672

原创 捕捉信号

之前我们知道,操作系统会在合适的时候对接收到的信号做出相应的处理。 那么现在我们知道这个合适的时候就是:进程从内核态返回到用户态,会检查信号,并作出相应的处理。 下面我们来详细的说下这到底是怎么回事? 1、当我们在执行我们所写的一个程序的时候,可能会因为中断、异常或者系统调用从而进入内核。 2、进入内核,内核会处理这些问题,处理完以后内核会返回到用户态,然而在返回之前,内核做的最后一件事情...

2018-04-28 19:46:00 439

原创 阻塞信号及相关的函数

1、信号的其他的常见的概念实际执行信号的处理动作称为信号抵达(Delivery)信号从产生到抵达之间的状态称为信号未决(Pending)进程可以选择阻塞(Block)某个信号被阻塞的信号产生时保持在未决状态,直到进程解除对此信号的阻塞,才执行抵达的动作注意阻塞和忽略是不同的,只要信号被阻塞就不会抵达,而忽略是在抵达之后可选的一种处理动作。2、内核中的表示 我们可以从中...

2018-04-28 14:49:49 460

原创 信号的基本概念及产生

一、信号的基本概念 一些小细节: 1、Ctrl-C产生的信号只能发给前台进程。一个命令后面加上一个&可以放到后台运行,这样shell不必等待进程结束就可以接受新的命令,启动新的进程。 2、shell可以运行一个前台程序和任意多个后台进程,只有前台进程才能接到想Ctrl -C这样控制键产生的信号。 3、前台进程在运行过程中用户随时可能按下Ctrl-C而产生一个信号,也就是说该进程的用...

2018-04-28 12:37:05 1325

原创 进程间关系和守护进程

一、进程组/作业/会话1、进程组1)每个进程除了有一个进程ID之外,还属于一个进程组,进程组是一个或多个进程的集合,通常,它们与同一作业相关联,可以接收来自同一终端的各种信号 2)每个进程有一个唯一的进程组ID。每个进程组可以有一个组长进程,组长进程的标识是,进程组ID等于其进程的ID。 3)组长进程可以创建一个进程组,创建该组中的进程。然后终止,只要在某个进程组中有一个进程存在,...

2018-04-27 00:09:23 876

原创 【进程间通信】——认识同步与互斥,了解生产者消费者原理。

临界资源在操作系统中,进程是占有资源的最小单位(线程可以访问其所在进程内的所有资源,但线程本身并不占有资源或仅仅占有一点必须资源)。但对于某些资源来说,其在同一时间只能被一个进程所占用。这些一次只能被一个进程所占用的资源就是所谓的临界资源。典型的临界资源比如物理上的打印机,或是存在硬盘或内存中被多个进程所共享的一些变量和数据等(如果这类资源不被看成临界资源加以保护,那么很有可能造成丢数据的问题...

2018-04-23 17:11:35 3741 1

原创 【进程间通信】------二元信号量P/V操作,封装成动态/静态库,并分别使用并测试

1、信号量相关代码生成静态库comm.h 1 #include <stdio.h> ...

2018-04-23 16:11:02 291

原创 【进程间通信】-----共享内存

1、概念: 共享内存允许两个不相干的进程访问同一个逻辑内存。 共享内存是最快的IPC形式。省略了两次拷贝,不再涉及到内核,进程不再通过通过执行内核中的系统调用来传递彼此的数据。共享内存的生命周期随内核。 优点: 1)数据的共享使进程间的数据不用相互的传递,而是直接通过访问内存,加快了效率。 缺点 1)共享内存没有同步与互斥机制,我们需要用其他方法进行进程间的同步机制。 我们需要借助互...

2018-04-23 11:16:47 543

原创 【进程间通信】------信号量(sems)

一直想看看ftok函数,今天就在这里进行简单的介绍下 ftok()函数我们在进行IPC通讯的时候必须指定一个ID值,这个值通常情况下就是由ftok进行提供。 ftok原型如下: key_t ftok( char * fname, int id ) 参数说明: fname就时您指定的文档名 id是子序号...

2018-04-22 15:13:49 799

原创 【进程间通信】-------消息队列(msgqueue)

认识消息队列消息队列提供了一个从一个进程向另外一个进程发送一块(有类型)数据的方法。每个数据块都被认为是一个类型,接收者进程接收的数据块可以有不同的类型值。消息队列也有管道一样的不足,就是每个消息的最大长度是有上限的(MSGMAX),就是每个消息队列的总的字节数是有上限的(MSGMNB),系统上消息队列的总数也有个上限(MSGMNI)。 IPC对象数据结构/usr/include/li...

2018-04-21 22:57:48 2010

原创 【恼人】——函数指针 函数指针数组 指向函数指针数组的指针

我们已经学过C语言很长一段时间了,相信大家对于这个问题还不是特别的陌生,今天我们就来再次的认识这些令我们头痛的函数的一些基本的区别。函数指针函数指针:函数指针是指向可执行代码段或调用可执行代码段的信息块的指针,而不是指向某种数据的指针。函数指针是将函数当做普通数据那样存储和管理。函数指针有一种固定的形式,就是包含一个确定的返回值类型和若干个函数参数。声明一个函数指针看起来与声明一个函数...

2018-04-21 00:12:34 4776 4

原创 【数据结构】-------求多出口迷宫的最短路径

上面我们已经写过递归和非递归来实现求解迷宫的问题,今天我们就在递归的基础上实现多条通路,最短问题。 初始化最短路径地图 ///////////////////////////////////////////////////////////////多通路最短路径///////////////////////////////////////////////////////////////...

2018-04-20 22:45:39 592

原创 【数据结构】-----非递归实现迷宫问题

在上篇中,我们已经实现了用回溯法也就是递归的函数来实现迷宫问题,在我们学习的过程中,我们知道,非递归的实现就是采用的循环的方法。在前面相关的函数我已经写过了,在这里我就不进行例举了。 非递归实现的数据结构typedef struct Maze{ int map[ROW][COL];}Maze;typedef struct Point{ int row; int ...

2018-04-20 14:36:36 1178

原创 【C语言】冒泡排序可以排序多个字符串

在实现多个字符串进行排序之前我们先来了解下冒泡排序: 算法原理: 每次对相邻的两个元素进行比较,若前者大于后者,那么我们就交换,如此这样一趟下来的话,最大的元素就被放在了最后面,重复以上的步骤后,就可以对元素进行排序。void swap(int *a, int *b){ int tmp = 0; tmp = *a; *a = *b; *b = tmp;...

2018-04-18 01:19:08 760

原创 C语言---main函数的实现

main()函数的相关知识main函数其实是有参数的: int main(int argc , char* argv[],char* envp[]) 这里有三个参数 : 第一个:argc是个整形变量,表示命令行参数的个数(含第一个参数,就是含.exe的字符) 第二个:argv是个字符指针的数组,每个元素是一个字符指针,指向一个字符串,这些字符串就是命令行中的每一个参数 第三个:...

2018-04-18 00:47:02 1857

原创 数据结构——链式队列的实现

认识链式队列利用数组实现了循环队列,这是静态的队列,缺点是需要预设大小,当队列满时,无法再插入新的数据,只有等队头的数据被取走以后才能往队列放入新的数据。还可以利用链表实现队列,这种方式动态创建节点需要的内存,当有新的数据节点要加入时,才去申请内存空间,不需要预设大小,整个队列需要的内存空间不需要连续,并且插入删除更容易实现。但是同时也带来存取速度慢的缺点,操作也比数组的方式更加复杂。...

2018-04-17 20:18:03 999 1

原创 【数据结构】------回溯法实现迷宫问题

我们先来了解下回溯法,什么是回溯法? 回溯法:对于一个包括有很多个结点,每个结点有若干个搜索分支的问题,把原问题分解为若干子问题求解的算法;当搜索到某个结点发现无法再继续搜索下去,就让搜索过程(回溯)回退到该节点的前一个节点,继续搜索该节点外的其他尚未搜索的分支;如果发现该结点无法再继续进行搜索下去的时候,就让搜索过程回溯到这个结点的前一结点继续这样的搜索过程,这样的搜索过程一直进行到搜索...

2018-04-17 20:10:34 532

原创 【进程间通信】----管道

进程间通信的概念:进程间通信(IPC,InterProcess Communication)是指在不同进程之间传播或交换信息。IPC的方式通常有管道(包括无名管道和命名管道)、消息队列、信号量、共享存储、Socket、Streams等。其中 Socket和Streams支持不同主机上的两个进程IPC。 以Linux中的C语言编程为例。 进程通信的本质是两个毫不相干的进程,看到了同一份资源(...

2018-04-16 10:56:48 154

原创 指针数组 数组指针

我们在学习C语言阶段,相关的指针方面的内容是我们以后学习中重要的东西,在以后的学习中涉及到指针的相关的知识,会用在各个方面,今天我们就来再次深入理解下指针 中的相关的知识。一、指针数组和数组指针指针数组:指针数组可以说成指针的数组,首先,这个变量是一个数组,是由“指针”进行修饰的,意思就是说这个数组中的所有的元素都是指针类型的,在32位系统下指针占4个字节。数组指针:可以说成是“数...

2018-04-15 08:47:45 310

原创 数据结构——顺序队列

一、基本概念只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表。进行插入的一端称为队尾(入队列),进行删除操作的一端称为称为队头(出队列),队列具有先进先出(FIFO)的特性。 队列的基本操作:初始化队列进队列出队列判断队列是否为空判断队列是否已满 队列可以由数组和链表两种形式实现队列的操作,分别称为顺序队列和链队列 顺序队列:顺序存储的队列 链队列:...

2018-04-15 08:45:02 1500

原创 基于链表实现栈

我们在链表的基础上实现栈,主要有以下操作入栈 - 出栈 - 取栈顶元素 - 初始化 - 销毁** 相关的代码实现的过程如下 1、数据结构 6 typedef char LinkStackType; 7 typedef struct LinkNode{ 8 LinkStackType data; 9 struct LinkNo...

2018-04-14 14:12:11 181

原创 顺序栈的相关的实现

一、栈的基本概念 栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。 栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(top),另一...

2018-04-13 23:19:07 299

原创 带头结点带环的双向链表的实现

在写这个代码的实现之前我们先来了解下相关的知识。 首先,带头结点带环的双向链表的特点: 带头节点:创建一个结点表示空链表,这个节点就是头结点,并且头结点中的数据不具有实际的意义。但是我们一般不关心头结点中的元素,只起“带头”作用。双向要求每个结点中都有一个next指针指向下一个,一个prev指针指向下一个。 1、双向链表的数据结构双向的带头结点的带环的链表有三个成员,一个是数据,一个...

2018-04-13 14:05:14 237

原创 编写简单的add/sub/mul/div函数,并打包成动/静态库,并分别使用。

动态库和静态库首先来看什么是库,库(Library)说白了就是一段编译好的二进制代码,加上头文件就可以供别人使用。 什么时候我们会用到库呢?一种情况是某些代码需要给别人使用,但是我们不希望别人看到源码,就需要以库的形式进行封装,只暴露出头文件。另外一种情况是,对于某些不会进行大的改动的代码,我们想减少编译的时间,就可以把它打包成库,因为库是已经编译好的二进制了,编译的时候只需要 Link ...

2018-04-12 23:34:13 1042

原创 对之前编写的自主shell进行修改,使其支持输入/输出/追加重定向

我们之前已经写过相关的代码的问题了,今天我们就对随后的代码进行修改,相关的概念性的问题,在这里我就不再进行多余的赘述了。 我们知道对于Linux来说,shell就是一个命令行解释器,当我们输入相关的命令,会去执行相关的操作。 比如当我们在输入ls -a -l命令,shell就会打印出当前目录的内容,这是如何实现的呢,shell自己就是一个进程,当我们输入类似于ls的命令,它会通过fork,ex...

2018-04-12 18:28:12 474

原创 fd(文件描述符)与FILE结构体

文件描述符fd 通过对open函数的学习我们现在知道了文件描述符就是一个小整数,从0开始。是文件指针数组的下标。 0&1&2 #include <stdio.h> 2 #include <sys/types.h> 3 #include <sys/stat.h> 4 #include <fcntl.h&gt...

2018-04-11 16:14:28 1864

原创 open/read/write/close等文件相关系统调用接口

1、系统调用 操作系统会对外表现为一个整体,但是会暴露自己的部分接口,这由操作系统提供的部分接口,称为系统调用。 2、库函数 系统调用进行适度封装,从而形成了库,有利于开发者进行二次开发。 下面我们就来解释系统函数与库函数的关系: 在下面这张图我们可以看到操作系统在底层软硬件的分层结构,同时观察到lib库函数所在与系统调用的关系,显然他们是上下级的关系,lib是对系统调用的二次封装,方便...

2018-04-11 01:11:46 805

原创 数据结构------单链表相关的面试题

1、从尾到头来打印单链表 在以前我们学习C语言的时候,我们都比较熟悉的就是逆序字符、汉诺塔、还有就是实现斐波那契数列的时候我们当时所用的方法就是递归,在这类问题的实现过,我们就对递归这个算法换是比较熟悉的,今天我们就来用递归的思想来实现从尾到头来打印链表。 那么我们刚开始拿到这个题的时候有点困惑,一时半会没想到解决的办法,最后才想到了递归这个方法。我最后得出逆序打印链表主要有三种做法: 1、...

2018-04-10 19:51:46 265

原创 vim的配置

最近在自己学习使用Vim,查阅了一些资料,发现可以将Vim配置的很强大,以下是我自己添加的一些Vim配置,首先先要输入vim ~/.vimrc来进入vimrc文件。 1 set nu "显示当前行号 2 3 set shiftwidth=4 "Tab空四个字符,并且自动对齐(首行缩进) 4 set softtabstop=4 5 set autoind...

2018-04-01 20:21:10 138

原创 centOS 6.5如何设置中文输入法方法

今天我来给大家写下最简单的安装中文的办法,简单好用,几个步骤就能让你的虚拟机变得好用。让我们拭目以待吧!!!! 1.在命令窗口输入su root命令,使之切换到root用户。 2、输入命令 yum install “@Chinese Support” 在安装完毕之后我们会看到系统给你的提示,说你完成,这些和用yum安装软件是一样的,相信我们大家都会安装的。 3、3.等待程序安装成功...

2018-04-01 19:54:32 3891 2

原创 我眼中的递归

总觉得递归真的很重要,我们在解决有些问题的时候,就需要用到这种思想,也许我们用到的地方不是特别多,但是自己多了解下还是有好处的。我们刚开始听到递归,大概是在C语言的时候,我们用递归解决了打印1234的问题,当时就觉得递归这种方法还是特别实用的,有时候真的能简化我们的代码,使我们解决问题变得更加的方便,今天我们就再来深入的理解下这个概念,算是对以前知识的一个浅显的总结。可能自己了解到的也不是特别的到...

2018-04-01 18:04:58 175

空空如也

空空如也

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

TA关注的人

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