Linux
文章平均质量分 62
qq_41027326
共同努力,共同进步
展开
-
自主编写shell
1.替换原理 用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数以执行例外一个程序。当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动历程开始执行。调用exec并不创建新进程,所以调用exec前后该进程的id并未变化2.实现一个shell#include<stdio....原创 2018-03-22 20:40:06 · 289 阅读 · 0 评论 -
消息队列
一.消息队列1.定义 (1) 消息队列提供了一个从一个进程向另外一个进程发送一块数据的方法 (2) 每个数据块都被认为有一个数据类型, 接收者进程接收的数据可以有不同类型的数据 (3) 消息队列也有管道一样的不足, 就是每个消息的最大长度是有上限的(MSGMAX), 每个消息队列的总的字节数是有上限的(MSGMNB), 系统上消息队列的总数也有一个上限(MS...原创 2018-03-29 15:54:06 · 168 阅读 · 0 评论 -
匿名管道
1.进程通信的目的 (1) 数据传输: 一个进程需要将它的数据传输给另一个进程 (2) 资源共享: 多个进程之间共享同样的资源 (3) 通知事件: 一个进程需要向另一个或一组进程发送消息, 通知它们发生了什么事情2.管道 管道是一种进程之间通信的一种方式, 我们把从一个进程连接到另一个进程的数据流叫做管道3.匿名管道 (1) 匿名管...原创 2018-04-05 18:28:00 · 228 阅读 · 0 评论 -
生产者消费者模型
1.基本概念 生产者和消费这模型也称为有界缓冲区问题.两个进程共享一个公共的固定大小的缓冲区. 其中一个进程是生产者, 负责专门往缓冲区中放数据,而另外一个进程是消费者, 负责专门从缓冲区中取数据. 问题在于解决当缓冲区已满的时候,此时当生产者还想继续往缓冲区中放数据, 当缓冲区空的时候, 消费者想要从缓冲取中取数据. 为了解决该问题,我们利用信号量来解决生产者和消费者问题. ...原创 2018-04-22 11:47:17 · 160 阅读 · 0 评论 -
读者写者问题
1.相关概念 在编写多线程的时候, 有一种情况十分常见. 那就是有些公共数据修改的机会特别少, 相比较改写, 数据被读的概率较高. 通常而言, 读的时候会常常伴随着查找的过程, 这就相对的比较耗时, 如果在读的过程中给其加锁, 那么写端可能会引起饥饿现象, 为了防止写端饥饿产生, 因此通常情况下规定写者优先权高于读者优先权. 例如一个飞机订票系统, 其中许多竞争的进程视图读写其...原创 2018-04-22 13:10:21 · 250 阅读 · 0 评论 -
进程和线程的区别
1.进程和线程的区别 进程是资源分配以及调度的独立单元, 而线程是CPU调度的基本单元 同一个进程可以包括多个线程, 并且线程共享整个进程的地址空间, 以及进程的资源 线程是轻量级进程, 它的创建, 销毁所需要的时间比进程小很多, 所有操作系统中执行的功能都是创建线程来完成的 进程的创建用 fork 或者 vfork, 而线程的创建却是用 pthread_c...原创 2018-04-22 16:20:06 · 260 阅读 · 0 评论 -
线程的终止分离
1.线程的终止 注意该函数是针对用户级别的, 其中 retal 必须指向一个全局变量, 或者是一个 malloc 分配的, 因为如果是线程的局部变量, 当该线程退出时, 其他线程不能得到这个变量, 因为线程的局部变量各自私有2. 现成的取消 其中thread是线程的 tid3.线程的等待与分...原创 2018-04-18 17:01:49 · 306 阅读 · 0 评论 -
信号量
一. 相关概念1.对信号量的基本定义 信号量本质上是一个计数器,里面的数字大小来记录临界资源的数目,其中有多少资源,信号量的大小就是多少,当信号量的值为1的时候,此时的信号量就叫做二元信号量,又称为互斥锁。同时需要注意的是信号量也属于临界资源,它的存在是为了保护临界资源,解决数据不一致的现象。 因此为了保证信号量的临界访问,于是就约定对信号量的操作必须满足原子操作。2....原创 2018-04-07 11:15:36 · 889 阅读 · 0 评论 -
将信号量代码生成静态库以及动态库
1.信号量相关代码生成静态库 2.信号量相关代码生成动态库原创 2018-04-07 12:02:30 · 202 阅读 · 1 评论 -
进程间关系和守护进程
一. 进程组/作业/会话1.进程组 每一个进程除了有一个进程ID之外, 还属于一个进程组. 进程是一个或多个进程的集合. 通常, 它们与同一个作业向关联, 可以接收来自同一个终端下的各种命令,信号. 每一个进程组都有唯一的进程组 ID. 每一个进程组都可以有一个组长进程. 组长进程的标识是, 其进程组 ID 等于组长进程 ID. 组长进程可以创建一个进程组, 也可以创建该进程组中...原创 2018-04-23 11:44:00 · 172 阅读 · 0 评论 -
进程的挂起以及可重入函数
相关接口 pause 函数用于将进程挂起. 如果信号的处理动作是终止进程, 则进程终止, pause 函数没有返回值; 如果信号的处理动作是忽略, 则进程被挂起, pause函数不返回, 如果信号的处理动作是捕捉, 则调用信号处理动作之后pause 返回 -1.来看一段代码#include<stdio.h>#include<stdlib.h>...原创 2018-04-14 09:39:45 · 633 阅读 · 0 评论 -
线程的同步与互斥
1. 互斥量 在Linux 下线程使用的都是局部变量, 而我们知道, 每一个线程都独立拥有自己的一个栈, 而这些局部便令就在栈中,而线程的创建就是为了实现通信, 此时线程之间无法共享这些变量 为了使得线程之间能够共享数据, 一次我们可以创建一个全局变量, 此时线程都在进程内部共享一个地址空间, 因此个线程之间就可以看到这个全局变量了 但是问题又来了, 创建了全局变量,...原创 2018-04-21 10:10:03 · 189 阅读 · 0 评论 -
五种IO模型
阻塞IO模型在内核将数据准备好之前, 进程将会一直等待, 直到内核将数据全部准备好非阻塞IO模型如果数据还没有准备好, 内核将会向当前进程返回一个 EWOULDBLOCK 错误码, 同时当前进程会不断的进行返回, 轮询式的取检查是否有数据准备好信号驱动模型要想实现信号驱动模型, 必须在之前给当前进程注册一个 SIGACTION 信号, 然后返回, 当内核中数据到达的时候...原创 2018-08-26 20:23:38 · 211 阅读 · 0 评论 -
命名管道
1.命名管道的创建(1) 通过命令创建mkfifo filename(2)在程序中创建int mkfifo(const char* filename, mode_t mode);2. 命名管道和匿名管道的区别 (1)匿名管道由pipe函数创建并且打开 (2)命名管道有mkfifo函数创建由open函数打开 (3) fifo 之间的两个进...原创 2018-03-29 09:29:31 · 342 阅读 · 0 评论 -
进程间通信(匿名管道)
1.进程通信的目的 (1) 数据传输: 一个进程需要将它的数据传输给另一个进程 (2) 资源共享: 多个进程之间共享同样的资源 (3) 通知事件: 一个进程需要向另一个或一组进程发送消息, 通知它们发生了什么事情2.管道 管道是一种进程之间通信的一种方式, 我们把从一个进程连接到另一个进程的数据流叫做管道3.匿名管道 (1) 匿名管...原创 2018-03-29 08:12:15 · 254 阅读 · 0 评论 -
线程
1. 线程的概念 (1)线程是进程内部的一个执行流, 一个进程至少有一个线程. (2)线程是调度的基本单位, 同时线程的切换粒度是比进程执行粒度更小 (3)线程和线程的大部分数据共享 (4)在 Linux 下没有真正的线程, 它是用进程模拟实现线程2.进程和线程 (1) 进程是资源分配的基本单元, 线程是调度的基本单位 (2)线程...原创 2018-04-17 11:51:59 · 227 阅读 · 0 评论 -
开发工具
1.编辑器 (1)vim vim是从vi发展出来的一个文本编辑器。代码补完、编译错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。 (2)sed sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,接着用sed命令处理缓冲区的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,只到文...原创 2018-03-22 12:32:52 · 222 阅读 · 0 评论 -
进程相关概念
1.进程相关概念 进程是代码的一次动态执行,担当分配系统资源的角色,进程信息是被放在一个一个数据结构中,是一个结构体task_struct 2.进程控制块内容 //linux下的进程控制块struct task_struct { volatile long state;// 说明了该进程是否可以...原创 2018-03-19 10:49:18 · 146 阅读 · 0 评论 -
LInux下du, df, top, free, pstack, su, sudo, adduser, password命令
1.du命令:du [选项] 文件 (1)功能该命令是显示指定文件以及下的所有文件占用系统数据块的情况,如果没有文件,默认为是当前工作目录 -a 显示所有文件对系统数据块的使用情况 -b 显示数据块大小时以字节为基本单位 -c 除了显示文件对系统数据块的使用情况外还显示出文件的总和 -s 只显示文...原创 2018-03-13 13:49:44 · 563 阅读 · 0 评论 -
Linux下的重要目录
1.bin目录 主要防止系统下的各种必备可执行文件2./proc 目录 这个目录相当于Windows下的计算机系统信息查看以及进程动态查看,可以查看计算机信息,用来存放当前计算机上的进程信息3./sys 目录(1)其中block目录用于存放块设备文件(2)bus存放总线类型 (3)power是电源选项(4...原创 2018-03-13 11:49:48 · 111 阅读 · 0 评论 -
进入一个目录需要那些权限
1.文件访问者的分类 文件的访问者具体可分为以下几类: (1)拥有者 (2)组拥有者 (3)其他用户 这些都代表什么意思呢? 其中r表示只读,w表示只写,x表示可执行,第一个字母代表了文件的类型,其中文件类型可以分为以下几种: 类型 含义 d 目录文件...原创 2018-03-13 10:23:35 · 391 阅读 · 0 评论 -
共享内存
共享内存是最快的一种IPC形式(消息队列,共享内存,消息队列)。因为消息队列,管道等都需要用到系统接口,而共享内存则是直接改变逻辑地址到物理地址的映射关系,即当一个进程A看到这片内存时,对应的只要改变进程B的映射关系,此时进程B就可以立马看到这份公共资源1.共享内存数据结构 其中的ipc_perm 是一个内核为每个 IPC 对象所维护的一个数据结构2.共享内存...原创 2018-04-01 21:35:28 · 192 阅读 · 0 评论 -
gdb调试多进程程序
1.gdb下调试多进程程序只需要以下几条命令即可 除此之外还可以查看正在调试的进程 info inferiors, 同时也可以将当前正在调试的进程切换到另外一个进程中让其取运行 2.代码调试演示#include<stdio.h>#include<stdlib.h>#include<unistd.h>...原创 2018-04-14 12:19:01 · 155 阅读 · 0 评论 -
信号的基本概念以及信号的产生
一. 信号产生的场景 1. 用户输入命令, 在shell 启动一个前台进程 2. 当用户按一下 Ctrl + C 的时候,从键盘产生一个硬件中断 3. 此时CPU 正在执行这个进程的带代码, 则该进程的执行代码暂停执行, CPU 从用户态切换到内核态处理该硬件中断. 4. 中断驱动程序将Ctrl + C 解释为一个 SIGIN 信号, 记在该进程的 ...原创 2018-04-10 10:58:19 · 633 阅读 · 0 评论 -
打动态库和静态库
一.动态库和静态库的定义1.静态库 程序在编译链接时把库的代码链接到可执行文件中。程序运行时就不再需要静态库 2.动态库 程序在运行的时候才去链接动态库的代码,多个程序 共享使用代码 3.动态链接 在执行文件之前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中,这个过程就叫做动态链接。其中动态库可以在多个程序间共享,使用动态链接使得可执行文件更小,...原创 2018-03-27 20:16:22 · 181 阅读 · 0 评论 -
信号的阻塞
一. 阻塞信号1.信号的相关概念 (1) 递达: 实际执行信号的处理动作称为信号的递达 (2) 未决: 信号从产生到递达之间的过程叫做信号的未决 (3) 阻塞: 进程可以选择阻塞某个信号, 被阻塞的信号产生时将保持在未决状态, 直到进程解除该信号的屏蔽, 才执行递达动作. (4) 阻塞和忽略的不同: 信号被阻塞就不会被递达, 而信号被忽略是该信号递达的一...原创 2018-04-10 17:14:46 · 1622 阅读 · 0 评论 -
信号的捕捉以及SIGCHLD信号
一. 信号的捕捉定义 用户提供一个处理函数, 要求内核在处理信号时必须切换到用户态,执行这个函数, 这种方式就叫做信号的捕捉二. 图解信号的捕捉过程 1. 由上图可以看出,当处理信号的执行动作时用户自定义的时候,此时就需返回该函数去调用该函数, 这就叫做信号的捕捉. 以前我们总是说进程收到信号时会在合适的时候取处理该信号, 现在可以看出,这个合适的时候就是当进程处理...原创 2018-04-10 21:46:49 · 955 阅读 · 0 评论 -
修改之前的myshell使之支持输入输出重定向
1.open函数 这个函数是打开一个文件(文件名叫pathname),以 flag 权限打开,flag 包括了以下几种 O_RDONLY(只读), O_WRONLY(只写), O_RDWR(读写),当文件打开成功时,函数返回所要打开的文件名, 当函数执行失败时,函数返回 -1. 2.write函数 write函数是打开一个文件描述符为 fd 的文件,并将该文件的内...原创 2018-04-03 17:27:06 · 338 阅读 · 1 评论 -
进程的通信
管道什么是管道由于进程之间是相互独立的,因此在进程与进程之间进行相互联系的时候,此时就需要采用一种机制,通过管道的方式将进程一个进程的执行数据交给另外一个进程,此时就可以以通过管道来实现匿名管道和命名管道匿名管道 创建一个匿名管道的方式是pipe(int pipe[2]) 要创建一个匿名管道,此时两个管道之间必须有父子关系,同时匿名管道对数据的读取是基于流的方式实现的,,同...原创 2018-09-05 10:43:00 · 181 阅读 · 0 评论