linux
胡小哲
捧着看不懂的故事,道着懵懂的错对。
展开
-
Linux基础
Linux基础一.Linux基本指令ls指令 功能 列出本目录下所有的目录与文件 ls [选项][文件或目录] 对于文件 ls 将列出名以及其他信息 对于目录 ls 将列出该目录下 选项 -a 列出本目录的所有文件 包括 . 隐藏文件 -l 列出本目录下文件详细信息 -k 以字节的形式列出本文件大小 -kh 以 k 显示文件大小 更加容易浏览 -t 以文件时间进行排原创 2017-11-18 10:41:40 · 370 阅读 · 0 评论 -
Linux进程概念 ---- 僵尸进程和孤儿进程
Linux 进程概念僵尸进程当子进程退出,并且父进程使用 wait 系统调用,没有读取到子进程退出的返回码时就会产生僵尸进程。 僵尸进程会以终止状态保持在进程表中,并且一直等待父进程读取退出状态代码。现在我们来模拟实现一个僵尸进程 在这里,我们创建一个子进程,等待 2s 后退出,但是父进程不回收子进程的退出码。此时子进程应该为僵尸进程。 僵尸进程的危害在前面我们提...原创 2018-03-01 11:59:57 · 259 阅读 · 0 评论 -
可执行目标文件
可执行目标文件我们已经知道连接器是如何将多个目标模块合并成一个可执行目标文件的。 此时,我们的 C 程序已经从一组 ASCII 文件文本,转化为一个二进制文件,而且这个二进制文件中包含加载程序到存储器并运行它所需的所有信息。ELF 可执行目标文件格式 我们可以发现,可执行目标文件类似于可重定位目标文件的格式。 在 ELF 头部描述文件的总体格式,包括程序的入口点(程序运行时要...原创 2018-02-23 00:03:45 · 2141 阅读 · 0 评论 -
Linux 中 popen 函数与 system 函数的区别
popen 函数函数原型#include <stdio.h> FILE *popen(const char *command, const char *type); command : 一个指向以 NULL 结尾的 shell 命令字符串的指针。这个字符串会使用 -c 标志传到 bin/sh ,shell 将执行这个命令。 type : 指向以 NULL ...原创 2018-03-04 00:21:58 · 910 阅读 · 0 评论 -
动态链接库
动态链接库又称共享库,可执行共享库。 在前面我们提到静态库中,静态库和所有软件一样,需要定期维护和更新,如果我们想要使用一个库的最新版本,我们必须显示地将程序与更新的库重新链接。 一个 C 程序通常都会使用标准 I/O 函数,在运行时这些函数的代码会被大量的赋值到每个运行进程的文本段,是对存储器资源的极大的浪费。于是共享库产生了,它解决了静态库的缺陷。 共享库实质上是一个目标模块,在运行...原创 2018-03-05 18:57:21 · 202 阅读 · 0 评论 -
进程间通信
进程间通信在前面我们学习了如何创建进程,但是如何让我们创建的这些进程相互联系起来,那么就需要利用进程间通信来完成。概述进程间通信就是在不同进程之间传播或交换信息,但是之前我们学过,每个进程在创建的时候都会分配自己独有的 4G 虚拟地址空间,进程之间都是相互独立的,所以一般而言是不能互相访问的,但是也有例外,那就是共享存储映射区。并且系统空间也是公共的,每个进程都可以访问,所以内核也...原创 2018-03-16 15:14:55 · 202 阅读 · 0 评论 -
C++ 网络爬虫 --- 爬取西安链家二手房信息
C++网络爬虫网络爬虫是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。 在这里,我们使用 libcurl 库来对某一特定网页的内容进行抓取。libcurl 库安装首先我们需要介绍一下 libcurl 库 libcurl 库的主要功能就是用不同的协议链接和不同的服务器。 libcurl 当前支持http, https, ftp, gopher, telnet,...原创 2018-03-27 16:19:39 · 541 阅读 · 0 评论 -
线程同步互斥机制
线程同步互斥机制线程互斥是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。例如 : 出现这种情况是因为操作系统在内核中对线程的调用的来回切换。代码可以并发的切换到其他的线程。互斥锁互斥锁以排他方式防止共享数据被并发访问。 互斥锁是一个二元变量,只有两种状态 开锁 和 上锁。 将某个共享资源与某个...原创 2018-04-23 17:20:35 · 2421 阅读 · 0 评论 -
Linux 异步信号处理机制
信号概述信号是软件中断。 信号是linux系统下的异步处理机制。 例如:在终端按写某些按键时,会通过信号机制停止一个程序。首先,每个信号都有一个名字,都以SIG开头,通过 kill -l 可以查看 其中有很多常见信号 SIGINT :当我们在终端按下 CTRL+C 时就会产生一个 SIGINT 信号。 SIGQUIT :CTRL+\ SIGTSTP :CTRL+Z...原创 2018-04-19 15:29:45 · 1095 阅读 · 0 评论 -
信号量 --- 哲学家就餐
比如我们有一张桌子,上面坐着五位哲学家 现在他们每个人都有一双筷子,并且都拥有了自己的编号。 桌子上摆满了菜,哲学家们现在开始只做两件事情,吃饭,或者思考。 当他们吃饭的时候就停止思考 ,当他们思考的时候就停止吃饭。 我们假设他们都会用筷子,而当他们要吃饭的时候都必须拿两根筷子。 而且每个哲学家并不互相交流,此时就会出现一个很严重的问题。 如果这些哲学家在准备吃饭的时候,先拿起...原创 2018-04-23 19:34:30 · 1052 阅读 · 0 评论 -
Linux 多线程
Linux 多线程线程概念在一个程序里的一个执行路线就叫做线程。 每个进程都至少有一个线程。进程和线程进程是资源分配的基本单位。 线程是调度和执行的基本单位。 线程共享进程的数据:代码段,数据段,bss段和堆段,文件描述符,打开的库,mmap映射的文件以及共享内存空间。 线程也有自己的私有数据:线程 id, PCB,寄存器,栈,errno,信号屏蔽字,调度优先级。 ...原创 2018-04-21 12:40:34 · 239 阅读 · 0 评论 -
Centos7 下安装 Mysql
Centios7 下安装 Mysql 5.7在删除之前先清空本机上的 Mysql rpm -qa | grep mysqlrpm -e -nodeps + 名称强制卸载再清楚与mysql相关的目录find / -name mysqlrm -rf + 目录名yum list | grep mysql 查看有没有相应的yum源 有的话可以直接安...原创 2018-04-25 21:27:46 · 311 阅读 · 0 评论 -
task_struct 结构剖析
在之前我们提到的,每个进程都有一个特殊的数据结构 PCB(进程控制块)来对进程进行管理。 在 linux 中,task_struct 就是我们所说的 PCB。 PCB 是控制进程的唯一手段。task_struct 内容大致可分为 - 标示符 :描述被进程的唯一标识符,用来区别其他进程。 - 状态 :任务状态,退出代码,退出信号等。 - 优先级 :相对于其他进程的优先级。 - 程序...原创 2018-02-20 22:39:00 · 348 阅读 · 0 评论 -
Linux 进程概念
进程概念进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。 每个进程都有自己的状态,和自己独立运行的空间。 进程需要由相关的结构体来进行管理,而在 linux 中进程是由内核中的 PCB(进程控制块) 来进行管理。OS 通过 PCB 来感知一个进程的存在。进程与程序的区别程序由 代码块+数据块 组成...原创 2018-02-20 00:19:33 · 182 阅读 · 0 评论 -
Linux 环境开发工具
Linux开发工具1 vim编辑器vim编辑器是Uinx/Linux操作系统下标准的编译器。vim编辑器的基本模式命令模式 控制屏幕光标的移动,进行文本删除,复制等编辑工作。以及进入插入模式和底行模式。 插入模式 只有在插入模式下才可以输入文字。 按esc退回到命令模式,刚打开的vim编辑器处于命令模式末行模式 保存文件或退出,以及设置编译环境等工作。 在命令行模式下输入冒号进入底行原创 2017-12-02 17:17:24 · 374 阅读 · 0 评论 -
Liunx 模拟实现 ls -l
模拟实现 linux 的命令 ls -l 首先要直到所输出的内容都代表着什么。 分别对应 文件类型及权限 硬链接数 拥有者 拥有者所在组 文件大小 月 日 时间 文件名我们可以从前向后一步一步进行处理。在 linux 中,我们可以利用 stat()函数来获取一个文件的状态。#include <sys/stat.h>#include <unistd.h>int stat(co原创 2018-01-13 13:00:52 · 781 阅读 · 1 评论 -
模拟实现 tree 指令
linux下的 tree 指令: 打印所有文件和目录,默认不打印隐藏文件 在这里,我只实现默认方式,并且文件只区分出需要进行遍历的目录文件,其他文件统一直接进行输出。要实现这个指令 首先要清楚 Linux 下的文件系统,以及如何对目录文件进行读取。文件表结构: 首先 我们要对输入的文件进行判断,判断其是否是目录文件。 如果输入的文件是普通文件,则直接输出,如果是目录文件则原创 2018-02-02 14:58:16 · 1562 阅读 · 0 评论 -
可重定位目标文件
目标文件有三种形式: 1. 可重定位目标文件 2. 可执行目标文件 3. 共享目标文件 编译器和汇编器生成可重定位目标文件/共享目标文件,连接器生成可执行目标文件。在这里我们首先介绍可重定位目标文件。 可重定位目标文件:包含二进制代码和数据,可以在编译时与其他可重定位目标文件合并起来,创建一个可执行目标文件。可重定目标文件格式: 注意: bss段 在目标文件中不占实...原创 2018-02-06 00:38:19 · 1187 阅读 · 0 评论 -
静态库
静态库: 实际上所有的编译器都提供一种机制,将所有的相关的目标模块打包成为一个单独的文件。这个文件称为静态库。 静态库可以用作链接器的输入,当链接器构造一个输出的可执行文件时,它只拷贝静态库到被应用程序引用的目标模块。 在编译完成之后,静态库可以被抛弃掉。优点: 可以对文件进行打包。 运行速度较快。 较相对安全。 将编译器的实现与标准函数的实现分离开来,并且仍然对程序员保持适度的...原创 2018-02-08 22:59:22 · 1083 阅读 · 0 评论 -
重定位
在前面,我们了解了可重定位目标文件的文件格式以及符号链接的过程。 一旦完成了符号解析,它就把代码中的每个符号引用和确定的一个符号定义联系起来。此时,链接器就知道它的输入目标模块中的代码节和数据节的大小。现在就可以开始重定位了。 在重定位的过程中,将合并输入模块,并为每个符号分配运行时地址。 重定位由两步组成重定位段和符号定义 链接器将所有相同类型的段合并为同一类型的新的聚合段。 然...原创 2018-02-09 22:11:15 · 1120 阅读 · 0 评论 -
进程替换
进程替换替换原理在前面我们在使用 fork 函数创建子进程的时候,往往和父进程执行的是相同的程序。但是实际在我们的期望中,子进程应该是执行和父进程不同的代码。所以此时,子进程往往要调用 exec函数从而执行另一个程序。调用 exec 并不创建新的进程,所以调用 exec 函数并不会改变该进程的 pid。 被替换的用户的代码和数据完全被新的程序替换,并从新的程序的启动例程开始执行。...原创 2018-02-26 16:29:49 · 465 阅读 · 0 评论 -
简单的自主 shell 编写
当我们打开一个终端的时候,我们可以在上面输入各种命令,从而与终端实现互动。 可以发现,每当一个指令的执行结束后,终端会等待我们的下一条指令的输入。 这就类似于我们写了一个死循环,一直在等待着命令的输入。当有一条指令输入时,创建子进程并将子进程替换为命令,执行子进程并且父进程等待子进程的执行结束,从而实现交互。 我们可以利用之前学的进程创建和进程替换来编写一个简单的自主shell。 ...原创 2018-02-26 17:03:57 · 482 阅读 · 0 评论 -
Linux中文件描述符 fd 与 FILE 结构体
Linux中文件描述符 fd 与 flie 结构体文件描述符文件描述符(file descriptor)是内核为了高效管理已被打开的文件创建的索引。文件描述符的操作返回的是一个文件描述符,内核会在每个进程空间中维护一个文件描述表,所有打开的文件都将通过此表中的文件描述符来引用。(在前面的 系统 I/O中有画图解释)文件描述符 fd 与 FILE 结构体fd 是一个非负整数,在调...原创 2018-02-26 18:54:29 · 399 阅读 · 0 评论 -
Linux 基础 I/O
Linux 基础 I/O概念在 Linux 操作系统中,实现了两类对文件 I/O 的管理,一类遵循 POSIX 标准,Linux 操作系统自身提供的 IO 系统调用函数,直接进行 IO 系统调用,我们在这里对这些函数进行简单的介绍。特性系统调用的 I/O 函数是不带缓冲的 I/O。每个 read 和 write 都调用内核中的一个系统调用。所有打开的文件都通过文件描述符...原创 2018-02-13 00:05:20 · 238 阅读 · 0 评论 -
Linux 下常见的进程调度算法
在操作系统中资源是有限的,当有多个进程或线程要使用这些资源时,因为资源的有限性,必须按照一定的原则选择进程来使用资源。 所以调度算法就是 :根据系统的资源分配策略所规定的资源分配算法。 调度算法要求 :高资源利用率,高吞吐量,用户满意等原则。 调度算法设计目标: 1. 批处理系统 增加系统吞吐量和提高系统资源利用率。 2. 分时系统 保证每个分时用户能容忍的响应时间。 3. 实时系...原创 2018-02-18 15:47:53 · 359 阅读 · 0 评论 -
Centos 7 安装 Reids 和 Python的Redis客户端
安装 RedisCentos 使用 yum 安装 Redis 时,会出现无法找到安装源的问题。 这是因为 Redis 在第三方源里,我们添加非官方的 epel 源库。yum install epel-release安装之后查看 yum repolist安装 Redisyum install redis安装成功之后,启动 Redis 服务systemctl ...原创 2018-04-25 23:32:00 · 1272 阅读 · 0 评论