
linux学习历程
文章平均质量分 82
linux小白的学习历程
Payshent
相互交流,共同进步
展开
-
shell中反引号和$()的区别以及eval命令
反引号和$()的区别 反引号和$()都是shell脚本中用来进行命令代换的命令,命令代换就是运行一个命令将其结果交给一个变量。 echo ‘echo \\ ’ //反引号 echo $(echo \\ ) 我们再把脚本改成8个\ 总结: 1、反引号本身对\做了解释,保留了本身的意思。如果我们想在反引号中起到\的特殊意义,用两个\来表示原创 2017-07-12 22:11:15 · 1891 阅读 · 0 评论 -
I/O多路复用之epoll服务器
1、epoll服务器的函数 epoll是linux特有的I/O复用函数,它的实现和select和poll有很大的差异。epoll是使用一组函数来完成任务,而不是单个的函数。epoll把用户关心的文件描述符上的事件放在内核里的一个事件表中,而无需向select和poll那样每次调用都要重复传入文件描述符集或事件集,但是epoll却需要一个额外的文件描述符,来唯一标识内核中的这个事件表。 1、e原创 2017-07-15 16:32:02 · 1309 阅读 · 0 评论 -
grep命令与正则表达式
一、什么是grep grep(global search regular expression(RE) and print out the line,全面搜索正则表达式并把它打印出来),grep是强大的文本搜索工具,它使用正则表达式并把匹配到的行打印出来。 UNIX的grep包含三种grep、egrep、fgrep,其中egrep和fgrep和grep的差别很小,egrep是grep的扩展,它能原创 2017-07-19 10:40:55 · 1421 阅读 · 0 评论 -
Linux sed命令
1、什么是sed? sed是一种非交互式的流式编辑器,在shell脚本和Makefile中作为过滤器使用也是非常普遍的。 sed处理文本的时候按行为基本单位进行处理的,grep只有‘查’的功能,但sed就可以增删查改。sed使用的时候是有风险的,可能会因为我们输入错误信息导致文本被更改,所以使用sed的时候需要谨慎处理。 把前一个程序的输出作为sed的输入,经过一系列的编辑命令转换为另一种格式原创 2017-07-20 22:06:53 · 1625 阅读 · 0 评论 -
Linux中的awk命令
1、什么是awk命令? 在上一节中我们讲了sed命令,我们知道sed命令是以行为基本单位来处理内容的,今天我们来讲一下awk命令。awk命令的与sed命令相比它不仅可以按行为单位处理还可以按列为单位处理文件。 awk是以一行消息为一条记录,每条记录为域。awk也是一种非编译的弱类型语言。 awk缺省的行分隔符是换行,缺省的列分隔符就是连续的空格和tab。awk实际上是一种很复杂的脚本语言,有像原创 2017-07-21 15:21:47 · 1956 阅读 · 0 评论 -
端口号的分类
端口 在网络上端口有两种概念,一种是物理意义上的端口,还有一种就是逻辑意义上的端口。 物理端口: 物理端口指的是物理存在的端口,如ASDL,Modem,集线器,交换机、路由器用于连接其他设备的端口,如:RJ-45端口、sc端口等等。 逻辑端口: 逻辑端口指的是逻辑意义上用于区分服务的端口,通过不同的逻辑端口来区分不同的服务。eg:用于TCP/IP协议中的服务端口,用于浏览网页服务的80端口原创 2017-06-18 21:44:57 · 1769 阅读 · 0 评论 -
CRC校验算法
一、什么是CRC校验算法 最近在学网络时在以太网的数据帧的末尾有一个叫CRC校验码的东西,遂不解。于是便一起学习一下,什么是CRC校验码。 CRC就是循环冗余校验码(Cyclic Redundancy Check),是数据通信领域常见的差错校验码,特征是信息字段和校验字段的长度可以任意的选定。 循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,原创 2017-06-19 13:18:44 · 9973 阅读 · 0 评论 -
ARP协议以及获取当前局域下主机MAC地址
一、什么是ARP协议、 ARP被称为地址解析协议,在局域网内通过IP地址查找目标主机的MAC地址。ARP协议是实现IP地址到MAC地址的转化。 二、ARP协议的工作原理 为什么使用ARP协议? 在进行网络通讯的时候源主机知道目标主机的IP地址和端口号,却不知道目标主机的硬件地址。而我们发送的数据包是先被网卡接收然后才处理上层协议,如果接收的数据包的硬件地址与自己的硬件地址不相符合,那么就会被原创 2017-06-24 11:14:23 · 7318 阅读 · 2 评论 -
socket编程之TCP单进程的服务器
今天介绍的是基于ipv4的socket网络编程,我们知道socket API是一层的抽象的网络编程接口,但各网络协议的地址却是各不相同的。 下图是sockaddr数据结构图: ipv4和ipv6的地址格式定义在netinet/in.h中,ipv4地址用sockaddr_in结构体表示,包括16位的端口号和32位的ip地址,ipv6地址用sockaddr_in6表示,包括16位的端口号和128原创 2017-07-02 13:13:24 · 1542 阅读 · 1 评论 -
基于TCP的多进程和多线程服务器
基于多进程的TCP服务器 在上一节我们写了关于TCP的单进程的服务器:http://blog.youkuaiyun.com/payshent/article/details/74109613 在里面我们可以单对单的进行两台主机的通信,但是单进程的服务器毕竟来说可服务的对象就很小,所以现在实现一个多进程的服务器。 代码展示: tcp_server.c:#include<stdio.h>#include<原创 2017-07-03 21:07:44 · 1328 阅读 · 0 评论 -
互斥锁与自旋锁
我们知道线程同步是并行编程中非常重要的手段,其中最典型的就是用pthreads提供的锁机制(lock)来对多个线程之间共享的临界区进行保护。我们知道pthreads也提供了多种锁的机制如:互斥锁、自旋锁、条件变量、读写锁。今天就先来讲讲自旋锁与互斥锁。 一、互斥锁 互斥锁也叫互斥量是我们实现同步的重要的工具,在线程访问共享资源之前对互斥量进行加锁,在线程访问共享资源后对互斥量进行解锁,通过加锁与原创 2017-06-22 10:43:28 · 1979 阅读 · 0 评论 -
linux下的系统调用和库函数调用
一、linux的结构 在系统调用之前我我们先来了解一下linux系统的结构图: linux的结构如图: 操作系统在内核的基础上进行延伸,提供了一些基础服务的组件。操作系统是通过驱动程序来管理硬件的,对上就暴露出一些接口,供上层来进行调用,这些接口就被称为系统调用。 shell是被包裹在linux内核的外层,通过一些命令来对操作系统发出指令的人机交互界面。而库函数就是在系统调用的基础上原创 2017-06-10 11:08:33 · 2734 阅读 · 1 评论 -
linux下的僵尸进程和孤儿进程
一、什么是僵尸进程和孤儿进程?僵尸进程:一个进程使用fork创建子进程,如果子进程退出而父进程并没有调用wait或者waitpid获取子进程的状态信息,那么子进程的进程描述符任然保存在系统中,这种进程就被称为僵尸进程。孤儿进程:如果父进程退出而它的一个或多个子进程还在运行,那么这些子进程就被称为孤儿进程。孤儿进程最终将被init进程(1号进程)所收养,并由init进程完成对它们的状态收集工作。二、问原创 2017-04-23 11:43:50 · 1277 阅读 · 0 评论 -
linux下的动态库与静态库
今天就来谈一下linux中比较重要的一个知识点–静态库和动态库。说到静态库和动态库啊,不得不提的就是程序编译链接的过程,现在有很多的IDE我们很少去关注程序编译链接的本质,但是其背后的运行机制却是必须要我我们熟悉的,我之前写过一片就是C、C++程序的编译链接过程的博客,详情见下: http://blog.youkuaiyun.com/payshent/article/details/72314685 库:原创 2017-06-15 12:09:04 · 1480 阅读 · 0 评论 -
注解--linux运维工程师
一、什么是大型网站运维? 首先明确一下,全文所讲的”运维“是指:大型网站运维,与其它运维的区别还是蛮大的;然后我们再对大型网站与小型网站进行范围定义,此定义主要从运维复杂性角度考虑,如网站规范、知名度、服务器量级、pv量等考虑,其它因素不是重点;因此,我们先定义服务器规模大于1000台,pv每天至少上亿(至少国内排名前10),如sina、baidu、 QQ,51.com等等;其它小型网站可能没转载 2017-06-10 11:20:28 · 1325 阅读 · 0 评论 -
linux下的信号
一、信号的概念 说道信号大多数人可能会想到在公路上的红绿灯,在我们linux也有着信号的概念。那么linux下的信号到底是怎么回事呢?我们还是今天就看看linux下的信号。 信号其实是一种软件中断,它为程序提供了处理异步事件的方法。异步事件就是事件可能会在任何时间内发生,很多重要的而程序都有对信号的处理,在linux下我们是通过命令 kill -l来查看系统中所有的信号列表和它们的信号编号。原创 2017-06-08 13:41:36 · 1298 阅读 · 0 评论 -
生产者与消费者模型
一、什么是生产者与消费者模型 在实际的生活中我们可能会遇到下面这种情形,一个模块负责产生数据,另一个模块负责处理数据。用来产生数据的模块成为生产者,用来处理数据的模块被成为消费者。只有生产者和消费者还不够,这个模型还必须要有一个缓冲区处于生产者和消费者之间,作为中介。生产者把数据放入缓冲区,而消费者从缓冲区中取出数据。 二、生产者与消费者模型的条件和用途 用一句话来说明生产者和消费者之间原创 2017-06-02 20:27:46 · 1245 阅读 · 0 评论 -
linux下的内核态与用户态
linux的内核是一个有机的整体。每一个用户进程运行时都好像有一份内核的拷贝,每当用户进程使用系统调用时,都自动地将运行模式从用户级转为内核级,此时进程在内核的地址空间中运行。 linux中的某些指令是非常危险的所以将linux中的指令分为特群级,和非特权级。 1、特权级 Intel x86架构的cpu一共有0~4四个特权级,0级最高,3级最低,硬件上在执行每条指令时都会对指令所具有的原创 2017-06-13 11:24:33 · 1219 阅读 · 0 评论 -
线程死锁及其解决
一、什么是死锁 死锁:(摘自百度百科) 两个或两个以上的进程在执行过程中,因争夺共享资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。 由于资源占用是互斥的,当某个进程提出申请资源后,使得有关进程在无外力协助下,永远分配不到必需的资源而无法继续运行,这就产生了一种特殊现象死锁。 二、死锁的原因及形成原创 2017-06-03 11:05:01 · 2736 阅读 · 0 评论 -
linux下的线程
一、linux下的进程与线程 进程: 进程是指在系统中能够独立运行并作为资源分配的基本单位,它是由一组机器指令、数据和堆栈等组成,并且每一个进程都有一个进程控制块PCB,在Linux下被称为task_struct。另外每个进程还有一个独立的地址,它和物理内存通过页表联系在一起。 线程: 线程是进程的一个部分,它在进程的地址空间上运行,和主线程一起共享虚拟地址空间的资源,一个没有线程的进程可以原创 2017-06-07 10:45:13 · 992 阅读 · 0 评论 -
linux下gdb调试多线程
一、多线程的调试命令 1、info threads: 这条命令显示的是当前可调试的所有线程,GDB会给每一个线程都分配一个ID。前面有*的线程是当前正在调试的线程。 2、thread ID: 切换到当前调试的线程为指定为ID的线程。 3、thread apply all command: 让所有被调试的线程都执行command命令 4、thread apply ID1 ID2 … co原创 2017-06-06 21:19:39 · 1443 阅读 · 0 评论 -
task_struct
我们知道都知道进程是一个正在执行的程序,而进程只是程序的一个实例。从linux的内核的角度来讲进程就是分配系统资源的一个单位,当一个程序被加载到内存的时候并为它分配一个PCB就成为进程。task_struct就是一个进程描述符,操作系统通过task_struct来感知进程的存在。 在linux中每一个进程都由task_struct数据结构来定义,task_struct就是我们常说的原创 2017-04-13 20:56:33 · 352 阅读 · 0 评论 -
Linux查询之find指令
在linux下一切皆文件,所以在目录中查找文件就显得尤为重要了。利用find指令我们可以在目录文件中搜索文件,Linux下find命令提供了相当多的查找条件,功能很强大。由于 find具有强大的功能,所以它的选项也很多,其中大部分选项都值得我们花时间来了解一下。即使系统中含有网络文件系统( NFS), find命令在该文件系统中同样有效,只你具有相应的权限。 在运 行一个非常消耗资源的find命令原创 2017-04-01 09:11:58 · 595 阅读 · 0 评论 -
文件描述符和文件指针
一、什么是文件描述符? 在linux系统中,“一切皆文件”所以设备也是以文件的形式存在的。对一个设备进行操作必须先打开这个文件,而打开这个文件就会用到文件描述符。文件描述符是一个很小的正整数,每个进程在PCB中都会保存着一份文件描述符表。而文件描述符就是这个表的索引,每个表项都有一个指向一个已打开文件的指针。所有执行I/O操作的系统调用都是通过文件描述符来完成的。在linux下进程是通过进程描述符原创 2017-05-07 11:38:32 · 1330 阅读 · 0 评论 -
linux下shell的简单实现
一、什么是shell? 我们知道shell是linux下的系统的用户界面,提供了用户与内核实现交互操作的一种接口。它接收用户输入的命令,并把收入到的命令交给内核去执行。也就是说:shell是一个命令解释器,shell还有自己的编程语言用于对命令的编辑,允许用户编写由shell命令组成的程序。 二、shell实现的原理 shell是内核和用户之间交流的一种工具,它是一种“外壳程序”。当我们启动l原创 2017-05-11 10:02:50 · 1704 阅读 · 0 评论 -
centos下的vi编辑器的使用
vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指令。由于对Unix及Linux系统的任何版本,vi编辑器是完全相同的,因此您可以在其他任何介绍vi的地方进一步了解它。Vi也是Linux中最基本的文本编辑器,学会它后,您将在Linux的世界里畅行无阻。 1、vi的基本概念 基本上vi可以分为三种状态,分别是命原创 2017-05-23 11:09:39 · 1263 阅读 · 0 评论 -
进程间通信--管道(pipe)
进程间的通信就是两个进程之间进行数据交换,在Linux中有好几种可以进行进程通信的方式,在这篇文章中我们主要介绍最基本的进程通信方式——pipe管道。 管道: 管道是一种最古老也是最基本的系统IPC形式,所有的Linux系统都提供此种通信机制。但是管道有以下两个局限性: 1、它是半双工的,即数据一个管道上的数据只能在一个方向上流动,如果要实现双向通信,就必须在两个进程之间建立两个管道。 2、原创 2017-06-06 09:38:56 · 1415 阅读 · 0 评论 -
linux下用gdb调试多进程
今天来学习一下linux下gdb如何调试多进程,在学习之前我我们能先看一张表: 这张表是gdb调试的命令表,这对那些对gdb不熟的同学来说是非常有必要的。 一、多进程调试的命令 1、set follow-fork-mode parent|child 因为gdb在一般情况下,只会调试主进程。这条命令就可以使gdb来实现多进程的调试,进入gdb后默认调试的是parent,要想调试child的原创 2017-06-06 20:52:51 · 1178 阅读 · 0 评论 -
进程间通信--IPC信号量
一、什么是信号量 信号量: 信号量的本质是一种数据操作锁,它本身不具有数据数据交换的功能,而是通过控制其他的通信资源(文件、外部设备)来实现进程间通信,它本身只是一种外部资源的标识。信号量在此过程中负责数据操作的互斥、同步功能。 信号量就相当于是一个计数器,当有进程对它所管理的资源进行请求时,进程先要读取信号量的值,大于0资源可以请求,等于0,资源不可以用,这时进程会进入睡眠状态直至资源可用。原创 2017-06-07 16:51:51 · 1298 阅读 · 0 评论 -
进程间通信--IPC之共享内存
一、共享内存 共享内存可以提供给服务器进程和客户进程之间进行通信,不需要进行数据的复制,所以速度是最快的,只需要让两个进程通过页表映射到同一块物理内存上面即可,这块物理内存是两个进程都可以访问到的,所以信息传递的效率是非常高的。在通常情况下,我们要确保的是一个进程在进行读的时候,另一个进程不能去执行写操作,这是同过信号量来实现的。共享内存是最快的一种IPC。 下面我们来看一下,共享内存实现的原理原创 2017-06-07 21:41:57 · 1169 阅读 · 0 评论 -
linux中的atexit
我们知道atexit函数是正常程序退出的时候调用的函数,被称为登记函数,函数原型为:int atexit(void(*)(void))。它的功能是注册终止函数(main函数之后调用的函数),目的是为了让进程正常退出。一、退出方式进程退出有8种方式:其中前三中是正常退出的方式1、从main函数返回2、调用exit3、调用_exit或_Exit后五种为异常退出方式4、最后一个线程从启动历程返回5、最后一原创 2017-04-19 20:47:53 · 745 阅读 · 0 评论 -
linux下的粘滞位--sticky bit
一、什么是粘滞位 今天给大家介绍的是linux下的粘滞位(sticky bit),那么什么是粘滞位呢?下面便个大家介绍一下。 粘滞位: 如果用户对目录有写的权限,则可以删除其中的文件和字目录,即使用户不是这些文件的所有者,而且也没有读和写的权限。粘滞位出现在执行许可的位置上,用t来表示。设置了该位后,其他用户就不可以删除不属于它的文件和目录。但是该目录下的目录并不继承该权限,要再设置才可以使用原创 2017-05-06 11:12:37 · 1112 阅读 · 0 评论 -
线程安全与可重入
一、什么是线程安全 说到线程安全许多初学者可能会感觉很高大上(说的就是我自己),但是当你试着去搞懂它的时候就不会这么感觉了,其实我们早就接触到了线程安全的问题,只不过自己不知道而已。那么到底什么才是线程安全呢? 线程安全: 代码所在的进程有多个线程在同时运行,这些线程可能在同时运行这些代码,如果多线程下运行的结果和单线程运行的结果是一样的,那么线程就是安全的。反之,线程就是不安全的。 一原创 2017-06-09 10:44:44 · 1958 阅读 · 0 评论 -
Linux文件的三个时间点
理解Linux文件的三个时间点:access time、modify time、change time 在linux的使用stat命令来查看文件的详细信息,里面会出现三个时间分别就是:access time、modify time、change time。下面将分别举这三个时间来做一个说明access time:表示的是最后一次(访问但没有改动)访问文件的时间。原创 2017-03-23 11:15:28 · 600 阅读 · 0 评论 -
IPC之消息队列
一、什么是消息队列 消息队列: 消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法,每个数据块都被认为是有一个类型,接收者进程接收的数据块可以有不同的类型值,我们可以通过发送消息来避免命名管道的同步和阻塞问题,所以消息队列是基于消息的,管道是基于字节流的。 消息队列和命名管道有一样的不足就是:每个消息的最大长度是有上限的(MSGMAX),每个消息队列的总的字节数是有上限的(MSGMN原创 2017-06-02 22:29:35 · 1271 阅读 · 0 评论 -
模拟实现sleep函数
一、普通版本下的sleep函数 前面我们学习了pause函数,知道了pause函数的功能是为了挂起当前的进程,直到有信号递达。有问题的可以参见我的上一篇博客:这篇博客将信号讲的很清楚,其中对于pause函数也做了相应的说明。 linux下的信号 今天我就是用这个pause函数来实现一个自己的sleep函数。 具体实现原理如图所示: 实现过程如下: 1、main函数调用了my_slee原创 2017-06-09 20:50:55 · 1460 阅读 · 0 评论 -
SIGCHLD--子进程的异步等待
在以前我们讲僵尸进程的时候说到,父进程fork出一个子进程,在子进程退出的时候父进程没有调用wait或者waitpid来获取子进程的状态信息,那么子进程的进程描述符还会保存在系统中,那么就会产生僵尸进程。 可参考本人博客:僵尸进程和孤儿进程 http://blog.youkuaiyun.com/payshent/article/details/70494825 我们在处理wait和waitpid的时候有两原创 2017-06-11 11:22:02 · 1059 阅读 · 0 评论 -
进程间关系与终端登录
一、进程组 进程组: 每个进程除了有一个进程id之外,还属于一个进程组。进程组是一个或多个进程的集合,同一个进程组的进程的组ID相同,每一个进程组都有一个唯一的组ID。 每个进程组都有一个组长,组长的pid与gid相同。组长可以创建一个进程组,创建该组中的进程,然后终止。只要进程组内任意一个进程存在,那么这个进程组就存在,与组长进程是否终止无关。 二、作业 作业: shell分前后台来控原创 2017-06-13 09:54:55 · 1252 阅读 · 0 评论 -
守护进程
一、什么是守护进程 守护进程: 守护进程也称精灵进程,是运行在后台的一种特殊进程。守护进程独立于控制终端并且周期性的执行某种任务或者等待处理某些打算的事件。生存周期长,常常在系统引导装入的时候启动,仅仅在系统关闭的时候才终止,可认为守护进程目的就是防止终端产生的一些信号让进程退出。因为它们没有控制终端,所以说它们是在后台运行的,很多服务器的应用和守护进程都有关。 二、守护进程的特征 1、独立原创 2017-06-16 13:34:06 · 2016 阅读 · 0 评论