Linux
文章平均质量分 68
DZ小明
__飘摇在星空的一颗星辰
__静摆在怒浪的一叶扁舟
展开
-
linux C之stat函数
之前写过一篇关于stat命令的博客,介绍了stat命令的使用和输出信息表示,今天又见到了stat函数,因为输出原因,准备整理一下。stat函数介绍 根据《UNIX环境高级编程》中对于stat函数的解释,stat函数和stat命令一样,都是返回该文件的详细信息。 函数定义为: #include <sys/types.h> #include <...原创 2018-03-29 11:41:54 · 9634 阅读 · 2 评论 -
Linux进程通信之共享内存
基于system V版本的进程间通信还有最后一种方式,那就是共享内存。 共享内存的最大的特点就是:它是基于system V 的通信方式中速度最快的一个,这是因为共享内存不经过页表的多次转化,和多次映射,这就节省了很多资源,试问:每次通信时都要把内存上的东西映射一遍,那么这浪费的时间就不是一点半点了。他只是在创建的时候将共享内存的物理地址映射到进程的虚拟地址空间里,之后每次操作都会直接对这块空原创 2017-06-14 15:26:07 · 537 阅读 · 0 评论 -
线程安全和可重入函数的对比
可重入函数 可重入函数简单也就相当于可以被中断的函数,即一个函数正在执行的过程中被其他函数或操作中断出去,在这个中断操作执行完毕后,再返回来执行原代码。 那么如果这个中断出去的函数对i进行操作呢? 假设这个中断函数对i直接进行加9,那么在中断函数返回之后i=9,sum只进行一次+=操作,但是原先的预期是从0+到9,所以跟我们的预期结果有很大的差异。 所以对于可重入函数要进行对原创 2017-06-26 11:18:24 · 754 阅读 · 0 评论 -
Linux进程通信之二元信号量
信号量的概念: Linux中,基于system V的进程间通信还有二元信号量的通信方式,但严格意义上来说,信号量并不具备数据交换的功能,它本质是一把数据操作锁。通过控制其他的通信资源(⽂件,外部设备)来实现进程间通信,它本⾝只是⼀种外部资源的标识。信号量在此过程中负责数据操作的互斥、同步等功能。一、为什么要使⽤信号量 为了防⽌出现因多个程序同时访问⼀个共享资源⽽引发的⼀系列问题,我们需要⼀种⽅法原创 2017-06-13 17:54:36 · 4899 阅读 · 0 评论 -
mysleep与sigsuspend函数
承接此文,建议先看这篇文章:http://blog.csdn.net/sinat_36118270/article/details/73719061 所以可以使用这篇文章后面的几个函数实现一个简单的mysleep函数,更加深入的了解信号 #include <stdio.h>#include <sys/types.h>#include <signal.h>#include <stdlib原创 2017-06-25 17:55:59 · 585 阅读 · 0 评论 -
浅谈信号之block,pending,handler
信号的概念为了理解信号,先从我们最熟悉的场景说起: 1. ⽤户输⼊命令,在Shell下启动⼀个前台进程。 2. ⽤户按下Ctrl-C,这个键盘输⼊产⽣⼀个硬件中断。 3. 如果CPU当前正在执⾏这个进程的代码,则该进程的⽤户空间代码暂停执⾏,CPU从⽤户态 切换到内核态处理硬件中断。 4. 终端驱动程序将Ctrl-C解释成⼀个SIGINT信号,记在该进程的PCB中(也原创 2017-06-25 17:43:01 · 2909 阅读 · 0 评论 -
Linux进程通信之消息队列的双向通信
上一篇博客我写了进程间通信基于管道的通信,但是管道的通信无疑有很大的缺点,最显著的就是只能单向通信,例如:server向client发消息,client无法回复;第二个就是只能在有血缘关系的进程间进行通信,虽然命名管道解决了第二点,但是第一点还是一个很大的问题。开个玩笑:微信如果只能单向通信的话,你还会用吗?我估计发个消息能难受死你。 所以,这就是接下来几种进程间通信的产生条件。消息队列、信号原创 2017-06-12 16:05:36 · 3771 阅读 · 2 评论 -
TCP/IP之间的三次握手以及四次挥手
TCP的三次握手 TCP的三次握手,一般都是由客户端发起请求,发送给服务器后,服务器解读信息,发现是一个TCP连接请求,在允许的情况下受理该请求,受理并处理后,此时服务器端已经准备好连接所做的一切服务,随机对客户端发起回应,等待客户端的链接,客户端收到回应之后,意识到服务器已经建立好连接并允许本客户端连接,所以发起对服务器的连接,服务器收到这个消息,二者真正意义上建立链接。 我画了一个图对应原创 2017-06-22 19:39:21 · 810 阅读 · 0 评论 -
浅谈TCP定时器
定时器 在TCP/IP协议栈中,因为重传,等待,确认的情况,很多都会用带定时器,所以定时器是TCP/IP协议栈中一个至关重要的“部件”,在很多时候都仰仗定时器来确认一个请求。最明显的大概就是TCP/IP协议栈中的四次挥手时的timewait时刻了,主动发起断开连接的一端,在等待timewait时间无回应后,即断开连接。这个时候的timewait就使用了一个定时器。 常见的几个定时器连接建立(原创 2017-07-02 09:55:47 · 1016 阅读 · 0 评论 -
Linux父进程对于子进程的异步等待
父进程为什么等待子进程 Linux中,存在多进程、多线程的服务。 进程是如何产生、如何消失的? 首先,打开Linux虚拟机或者系统的时候,系统自己建立一个init进程,这是Linux系统的基础进程,然后init进程再根据一些配置文件决定创建哪些进程,或者我们在终端自己创建一个新进程的时候,如果你有时间,你可以一直追查这个进程的祖祖辈辈,你会发现,他们都指向一个进程,那就是init进程。原创 2017-06-27 16:59:27 · 3845 阅读 · 0 评论 -
Linux线程的操作以及与进程的区别
线程的感念 Linux中不仅有进程这一概念,还有线程这一概念。简单来说,线程是指:在一个进程中,不同的执行流。线程的大部分概念和进程相似,所以他们有很大的相同之处。多线程之间的切换和调度就好像进程间的切换和调度一样,他们都在进程的地址空间运行,所以多线程之间可共享一些资源: 1、文件描述符表; 2、每种信号的处理方式; 3、当前工作目录; 4、用户id和组id; 但是原创 2017-06-15 15:34:29 · 707 阅读 · 0 评论 -
ARP协议和ARP脚本抓取MAC地址
ARP协议——地址解析协议。是TCP/IP四层结构中的链路层,是通过IP地址寻MAC地址的一种协议。ARP协议的工作过程 本地主机需要给另一个局域网中的主机发送数据,但不知道另一个主机的MAC地址,此时采用ARP协议得到对方主机的MAC地址,再进行数据的发送。 首先,在发现本地的ARP缓存表中没有这个IP地址对应的MAC地址的时候,即使用ARP协议,广播一个ARP发送帧向整个局域网,局域网中原创 2017-06-27 18:47:45 · 3459 阅读 · 0 评论 -
一致性哈希算法及其在分布式系统中的应用
原文链接:http://blog.codinglabs.org/articles/consistent-hashing.html 摘要本文将会从实际应用场景出发,介绍一致性哈希算法(Consistent Hashing)及其在分布式系统中的应用。首先本文会描述一个在日常开发中经常会遇到的问题场景,借此介绍一致性哈希算法以及这个算法如何解决此问题;接下来会对这个算法进行相对详转载 2017-08-31 13:37:05 · 363 阅读 · 0 评论 -
I/O复用之epoll的ET模式
在I/O复用中epoll模式无疑是最为高效的,凭借其底层的红黑树和就绪链表就能省却很多时间,也不用将监视的socket来来回回的从内核拷贝到用户态下,并且他还在更深层次中做了一些我们不知道的事情。但是epoll中ET(Edge Trigger,边沿触发)为我们提供了更高效的解决模式。默认状态下epoll使用的是LT(Level Trigger,水平触发)。 对于LT模式,当epoll_原创 2017-08-27 10:23:35 · 429 阅读 · 0 评论 -
I/O复用之epoll服务器
原理剖析 其实在写完poll服务器之后,“写”一个epoll服务器貌似很简单了,但是实际上epoll服务器的实现和poll的实现差了十万八千里,仅仅在内核态到用户态的拷贝中,就省却了很大的时间。最底层的源码本人因为才疏学浅,剖析不了。但是原理还是能说一点点。epoll在底层使用了三个关键函数: int epoll_create(int size); int epoll_ctl(int ep原创 2017-08-26 11:30:12 · 412 阅读 · 0 评论 -
epoll为什么这么高效?
原文链接:https://zhidao.baidu.com/question/687563051895364284.html 百度知道上的一位大神,讲的是在太好了。一、明确epoll的使用以一个生活中的例子来解释. 假设你在大学中读书,要等待一个朋友来访,而这个朋友只知道你在A号楼,但是不知道你具体住在哪里,于是你们约好了在A号楼门口见面. 如果你使用的阻塞IO模型来处理这个问题,那么你就只转载 2017-08-26 10:35:01 · 5280 阅读 · 2 评论 -
I/O复用之poll服务器
github代码:https://github.com/NICK-DUAN/Three-U/tree/master/poll_server代码编写 poll服务器的编写上,就不能直接在代码上做文章了,需要先了解一下poll函数中的几个API和参数。 int poll(struct pollfd *fds, nfds_t nfds, int timeout); 先说返回值,返回值原创 2017-08-26 09:47:48 · 509 阅读 · 0 评论 -
I/O复用之select服务器
学习了select之后,也有好一段时间了,但是一直没有提起写一篇关于select的博客,大概也是因为自己那会还没搞懂吧,这段时间在看《linux高性能服务器编程》时,又看到I/O复用对于select,poll,epoll的用法实例和比较,又从头看了一次之前写的代码,虽然是在老师的指导下写的,但是印象还是很深刻的,现在看来,当时一头雾水的写,顶多记得一个写代码的步骤,而并没有明白为什么和原理,甚至当初原创 2017-08-25 17:56:08 · 563 阅读 · 0 评论 -
fork后printf如何输出
#include <stdio.h> #include <unistd.h> #include <fcntl.h>int main(void) { int i; for(i=0; i<2; i++){ fork(); printf("-"); } return 0; }本人思路:答:三个 因为是先fork,再pr原创 2017-07-16 23:36:21 · 4514 阅读 · 0 评论 -
Linux之死锁产生条件&解决方法
何为死锁: 现有A、B两个进程和a,b两把锁,a锁保护a资源,b锁保护b资源,现在A申请a资源,则a锁上锁,B申请b资源,则b锁上锁。此时,A又需要b资源,对b资源进行申请,但B正在使用,即b锁已经上锁,没有申请到,即挂起等待,同时,B需要a资源,对a资源进行申请,但A已经挂起,并且A持有a资源,所以B不可能申请到,所以B也 挂起。此时、B都挂起——死锁。死锁产生的四个必要条件 1、互斥条件——原创 2017-06-15 17:25:53 · 3056 阅读 · 0 评论 -
Linux进程通信之管道(匿名,命名)
进程间通信产生的条件: 每个进程各⾃自有不同的⽤用户地址空间,任何⼀一个进程的全局变量在另⼀一个进程中都看不到 所以进 程之间要交换数据必须通过内核,在内核中开辟⼀一块缓冲区,进程1把数据从⽤用户空间 拷到内核缓 冲区,进程2再从内核缓冲区把数据读⾛走,内核提供的这种机制称为进程间通信 (IPC,InterProcess Com) 管道就是进程间通信最基本的一种通信方式。 管道是原创 2017-06-10 12:38:52 · 606 阅读 · 0 评论 -
ip(点分十进制 <==> 二进制整数)之间的转换
linux的套接字部分比较容易混乱,在这里稍微总结一下。 地址转换函数在地址的文本表达式和它们存放在套接字地址结构中的二进制值进行转换。 地址转换函数有四个:其中inet_addr 和 inet_ntoa适用于IPv4,inet_pton 和 inet_ntop同时适于用IPv4和IPv6。 套接字地址结构分为IPv4套接字地址结构sockaddr_in和IPv6套接字地址结构sockaddr转载 2017-06-20 21:51:28 · 6620 阅读 · 0 评论 -
Linux下进度条的简单实现
逻辑 进度条实现的简单逻辑就是第一次输出一个字符,第二次输出两个字符…直到最后一直输出100个字符,但每次只显示一行,所以这就要明确一下“缓冲区”这个概念。 简单的谈一谈缓冲区,每次我们使用scanf和cin时,输入的东西都不值是直接输入到我们想要输入的内存空间,而是全部储存到了输入缓冲区的stdin,在我们输入完成之后,即敲击回车键之后,缓冲区输入完成,编译器就会从缓冲区上拿走当前变量原创 2017-04-05 20:46:16 · 622 阅读 · 0 评论 -
Linux终端彩色打印+终端进度条
原文链接:https://my.oschina.net/jcseg/blog/178047开发的一个应用程序选择了终端界面, 为了使软件稍微好看些, 研究下Linux终端的彩色打印, 并且基于这个彩色打印实现了几种进度条, 在此总结下: (更多的是觉得这个东西挺好玩的... )一. Linux终端色彩打印:1. 属性介绍: (1). 来自网络的ANSI属性控制码:转载 2017-04-05 17:51:19 · 6510 阅读 · 0 评论 -
Linux的task_struct中的成员及代表意义
进程状态/调度数据成员(State) 这个信息中可细分为6中状态,分别为:TASK_RUNNING:处在这个状态的进程,不是在运行就是准备运行,只是等待运行本进程的资源到位。即准备运行的进程只要得到CPU就可以立即投入运行。进程中有一个运行队列run_queue,容纳所有可运行的进程,调度进程时,从中选择一个进程进行执行。当前运行进程一直处于该队列中。TASK_INTERRUPTIBLE:处于等待原创 2017-04-13 11:10:07 · 2067 阅读 · 0 评论 -
Linux中的粘滞位的作用
在Linux中,有个“一切皆文件”的说法,而且每个“文件”都有自己的权限,但是有些时候这些权限起的作用有点让人琢磨不透,对文件的管理就会达不到条理的、合适的管理要求。最简单也是最典型的例子就是:创建一个目录,在这个目录里面创建一个普通文件,这个文件的权限默认情况下是664,即“rw-rw-r–”,表示other用户没有权限写入和执行,但是假如我们切换道另一个用户,然后rm即删除这个文件,会发现,在询原创 2017-03-26 13:35:58 · 750 阅读 · 0 评论 -
Linux中find的常用指令的用法及作用
Linux中find的指令尤为重要,所以我们要对find指令的一些常用指令进行了解以及熟练使用,这对Linux的使用有着至关方便的作用,学习完find的一些指令并会熟练使用时,你就会发现Linux这个平台上查找实在是太方便了,再或许,你可能会觉得相比Windows,操作起来实在是更显得更有范儿! 试试就知道了,以下的指令中如果没有确切说明,那么“<>”这对括号只是为了区分而使用的 1.>原创 2017-03-26 11:52:08 · 25615 阅读 · 0 评论 -
CentOs的Linux联网配置
首先切换成超级用户 su之后输入登陆密码 然后在主工作目录下:vim /etc/sysconfig/network-scripts/ifcfg-eth0 直接进入 修改里面的信息(按“i”进入插入模式):我的是这样的: DEVICE=”eth0” // 描述网卡对应的设备别名BOOTPROTO=”static” //启用静态IP地址IPADD=192.168.1.107 //设置IP地原创 2017-04-01 10:44:08 · 566 阅读 · 0 评论 -
Linux下stat命令的Access、Modify、Change时间的含义
Linux下,我们通常使用“ls”、“ll”或他们家族的命令来查看一个文件的详细信息,但是有些人还是不满足,谁呢?我们的程序猿呗_qaq,可能一觉醒来发现程序挂了,崩溃了,光看“ll”下的数据可能不够(可能stat也不够,但是我目前只知道这么多了qaq), 所以stat一下这个程序,就能看见好多信息了。 当我们如此输入命令时: stat 文件名 就会显示这个文件的更多详细信息原创 2017-03-19 18:47:54 · 6694 阅读 · 0 评论 -
Linux权限的简单用法(使用者、文件、目录)
首先,我们需要知道Linux中的权限是十分重要的,而且权限分为两类:一类是使用者的权限,一类是文件以及目录的是否可读、写、执行的权限。 拥有者–所属组–other 首先很多人不明白这三个使用者的权限是什么意思。一般情况下,拥有者是这个文件的创建者,即哪个用户创建的这个文件。并且在创建新用户的时候会创建出一个同名的组,这个拥有者默认包含在这个所属组中。我们先来理一理这三者的联系去区别,对于初原创 2017-03-19 14:05:42 · 5134 阅读 · 0 评论 -
Linux之file_struct&fd(file descriptor)
Linux中每个进程会产生一个PCB(Process Control Block)进程控制块,既然是一个进程,那么就会在这个进程中对文件进行操作,所以每个PCB中会对应生成一个struct file(文件描述符表),直观的看。每个位置都对应一个指针指向目标文件。这个位置使用open函数来确定的。open函数 open函数的原型为: int open(const char *原创 2017-05-11 10:23:32 · 768 阅读 · 0 评论 -
Linux下的重定向
linux中使用重定向符号可以实现输出输入重定向,默认条件下,标准输出和错误输出都是终端,用重定向符号可以把标准输出和错误内容进行重定向,例如把标准输出重定向到文件,看下面的详细解释输出重定向: 默认条件下,标准输出和错误输出都是终端,可以把标准输出和错误内容进行重定向: 复制代码 代码如下:[~]# echo “hello!” hello! [~]# echo “hello!” -转载 2017-05-07 18:27:20 · 255 阅读 · 0 评论 -
linux之僵尸进程、孤儿进程
僵尸进程即为进程已经执行完毕,但是其父进程没有调用wait/waitpid,则该进程将变成一个僵尸进程,虽然没有执行,但占用系统中的一个PCB空间。僵尸进程多的话,可以将系统卡死。 僵尸进程的实现为:使用folk创建一个子进程,让子进程进来之后很快就退出,父进程什么也不做,即没有调用wait/waitpid,所以该子进程就成为了一个僵尸进程。 int main(){ pit_t原创 2017-04-25 20:38:31 · 1210 阅读 · 0 评论 -
TCP报头标志位URG/PSH/SYN/ACK/FIN/RST
TCP报头 TCP是TCP/IP协议栈中的传输层支持的协议,并且TCP有自己报头信息。 TCP的报头信息如下表: TCP是一个面向连接的、可靠的传输协议。而这个可靠传输的功能则是靠32位序号和32位确认序号实现。TCP报头的标志位 TCP报头中一共有六个标志位:URG/ACK/PSH/RST/SYN/FIN。 SYN TCP三次握手中,如果A是发起端,则A就对服务器发原创 2017-06-29 20:26:40 · 9081 阅读 · 0 评论 -
端口号相关
端口号的作用 本来准备先描述一下什么是端口,但是末学才疏学浅,绞尽脑汁也没有想出一个清晰的关于端口的描述。 但是我想,知道端口号的作用后,对端口的认识会清晰起来。 端口号:即是本地计算机中唯一描述一个进程的“代号”。一般跟IP组合为套接字,描述网络中唯一的一个进程。端口号的分类 端口号可分为三类:公认端口、注册端口、动态/私有端口。 公认端口 公认端口端口号的范原创 2017-06-29 17:33:15 · 735 阅读 · 0 评论 -
路由原理与路由表生成
何为路由 路由工作在TCP/IP四层协议栈的网络层,通过转发分组实现网络互连,并连接两个IP子网。是指分组从源端到目的端时路径的进程。在我国,路由一般支持TCP/IP协议。路由器根据网络层的地址和路由器内部维护的路由表决定下一跳地址,分组到达路由时,更改链路层MAC帧的报头继续转发。 平常人们一直容易将路由与桥接弄混,但是桥接和路由的区别非常明显:路由与桥接的关键区别点在于路由发生在网...原创 2017-06-29 17:02:42 · 26815 阅读 · 11 评论 -
gdb调试多好几次&线程
相信对于初学多进程和多线程的童鞋们,每次编译器报出一大堆看不懂的错误,就头大,这改改,那修修,就是不对。想起来gdb调试,但是不会,一度怀疑是不是gdb不可以进行多进程和多线程的调试,那我告诉你:gdb很强大的,当然可以进行这些调试,即使我一度也这样认为,所以在我懂了一些和查阅了一些资料后,整理出来和大家分享。 多进程调试 原文链接:http://blog.163.com/jiams_wang转载 2017-06-18 21:45:04 · 1708 阅读 · 0 评论 -
Linux shell的模拟,并实现输出重定向
#include <stdio.h>#include <unistd.h>#include <sys/types.h>#include <sys/wait.h>#include <pwd.h>#include <stdlib.h>#include <sys/stat.h>#include <fcntl.h>#include <string.h>int main(){ cha原创 2017-05-22 11:42:57 · 1361 阅读 · 0 评论 -
Linux基于单链表&环形队列的多线程生产者消费者模型
生产者–消费者模型简述 对于生产者–消费者模型,相信我们都不陌生,因为生活中,我们无时无刻不在扮演生产者或消费者。但是对于Linux中的生产者–消费者模型,大家又了解了一个什么程度? 其实,说白了就是一个生产,一个消费的关系,而且保证生产者在不生产的时候,消费者无法消费(这跟生活中一样,只不过生活中我们是确实消费不到任何东西,但在计算机中,我们就有可能消费到无效数据,、乱数据、过期数据等等)原创 2017-06-16 17:39:35 · 1182 阅读 · 0 评论 -
atexit——注册函数
atexit()名为注册函数,他的使用也很简单。 即:在main函数结束之前调用atexit(函数指针)参数中的函数。 那么,main函数中注册多个atexit函数,会全部执行吗?会全部执行的话,执行的顺序是什么呢? 为此,我使用了下面这些代码验证: #include <stdio.h>void fun1(){ printf("this is fun1 functi原创 2017-04-25 21:17:44 · 1095 阅读 · 0 评论