Linux基础学习
Linux基础学习所有知识~
mxrrr_sunshine
这个作者很懒,什么都没留下…
展开
-
Linux-守护进程
认识守护进程 守护进程也成为精灵进程,是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待某些发生地事件。守护进程是一种很有用的进程。Linux的大多数服务器就是用守护进程所实现的。 Linux系统启动时会启动很多系统服务进程。这些服务进程没有控制终端,不能直接和用户交互。其他进程都是在用户登陆或运行程序时创建,在运行结束或用户注销时终止,但守护进程不受用户登陆注销的原创 2018-04-22 19:27:59 · 163 阅读 · 0 评论 -
Linux-线程理解,线程创建,终止,等待与分离
Linux下线程在Linux下,线程被称为轻量级进程。也就是说,Linux下是用进程模拟线程的。每一个用户态线程,在内核中都对应一个调度实体,也拥有自己的进程描述符。 在认识线程之前,一个进程对于内核中的一个进程描述符,对于一个进程id。但是现在引入线程的概念之后,情况发生了变化,一个用户进程下管辖了N个用户态线程,每个线程作为一个独立的调度实体在内核态都有自己的进程描述符,进程和内核的描述符就变原创 2018-04-19 10:34:11 · 382 阅读 · 0 评论 -
Linux-线程的同步与互斥:互斥量,条件变量,读写锁,屏障
同步与互斥先来说说为什么线程需要同步与互斥机制。 如果每个线程使用的变量都是其他线程不会读取和修改的,那么就不存在一致性问题。同样,如果变量是只读的,多个线程同时读取该变量也不会有一致性问题。但是,当一个线程可以修改的变量,其他线程也可以读取和修改的时候,我们就需要对这些线程进行同步,确保他们再访问变量的存储内容时不会访问到无效的值。 假设两个线程读写相同变量时,线程A读取变量然后给这个变原创 2018-04-21 21:24:33 · 360 阅读 · 0 评论 -
Linux-线程:posix信号量实现生产者消费者模型
与sustem v的区别之前我们学到过system v版本的进程间通信中也有syetem v版本的信号量,那么它与posix的信号量有什么区别呢? 一般来说System V版本的进程间通信用于进程,而POSIX版 本的进程间通信用于线程。他们的区别主要在于信号量和共享内存。 信号量的区别: system v版本的信号量一般是随内核的,无论有无竞争都要执行系统调用,所以性...原创 2018-04-22 11:16:29 · 1291 阅读 · 0 评论 -
Linux-gdb调试多线程
之前我们叙述过如何用gdb调试多进程,现在来讲讲如何用gdb调试多线程。 首先先要了解gdb调试多线程的基本命令: Tables Are info threads 显示当前可调试的所有线程,GDB会给每一个线程都分配一个ID。 前面有*的线程是当前正在调试的线程。 thread ID 切换当前调试的线程为指定ID的线程。 thread apply all com原创 2018-04-22 12:20:17 · 175 阅读 · 0 评论 -
Linux-进程间关系:进程组/作业/会话
本篇文章主要讲述进程间关系的几个基本概念。从以下几个方面叙述:进程组作业会话进程组 一个进程除了有一个进程id之外,他还属于一个进程组。进程组是一个或多个进程的集合。通常,它们与同一个作业相关联,可以接受来自同一终端的各种信号。每个进程组有一个唯一的进程组id。每个进程组都可以有一个组长i进程。组长进程的标识是,其进程组id等于其进程id。组长进程可以创建一个进程组,创建该组中进程,然后原创 2018-04-22 13:25:09 · 337 阅读 · 0 评论 -
Linux-浅识信号机制
信号的基本概念首先需要区分信号机制与通信机制不是一回事,通信机制是为了传输数据,信号机制是一种通知机制,通知事件的发生。信号量是进程间通信的一种方式,与信号没有关系,信号是一种通知机制。 我们可以先抽象的描述一下信号,就像我们过马路时,遇到的红绿灯一样,我们记录下该信号,由于我们知道如何处理不同颜色的信号,所以我可以做出所对应正确的行为。信号也是如此,进程由于认识并记录下了该信号,然后再处理...原创 2018-04-09 17:37:19 · 212 阅读 · 0 评论 -
Linux-竞态条件-用信号机制实现sleep函数
相关接口函数 pause:使进程挂起直到有信号递达。 如果信号的处理动作是终止进程,则进程终止,pause没有机会返回;若信号的处理动作是忽略,则进程继续处于挂起状态,pause不返回;若信号的处理动作是捕捉,则调用信号处理函数之后pause返回-1,所以pause只有出错的返回值。my_sleep思路:main函数调用my_sleep函数,后者调用sigaction函数注册了SIGA原创 2018-04-10 13:10:41 · 230 阅读 · 0 评论 -
Linux-浅析可重入函数与不可重入函数
背景首先函数我们都不陌生,学过任何一门编程语言的都知道函数。那么什么是可重入函数?我们都知道,函数是一段被加载到内存中的代码。函数的代码可短可长,执行的长度也不能确定。在多线程中,线程之间是可以切换的。函数是一段写好的既定的代码,属于程序共有的代码段。一个进程中有多个线程,每一个线程都有可能调用这段函数去执行。然而,多线程环境中,你也不知道下一秒是那个线程在运行,随时随地都是在变化的。所以,既然我们原创 2018-04-10 17:08:02 · 527 阅读 · 0 评论 -
Linux-如何用gdb调试多进程
之前学习安装工具时,简单的学习使用了gdb调试器,但是还是很不熟悉,这次学习了如何用gdb调试多进程做一总结,并且复习一下之前的gdb调试。gdbgdb的功能? 主要功能 1、启动程序,可以按照你的自定义的要求随心所欲的运行程序。 2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式) 3、当程序被停住时,可以检查此时你的程序中所发生的事。 4、动态的改变你程序原创 2018-04-11 14:16:24 · 293 阅读 · 0 评论 -
Linux-core dump详解
core dump首先解释什么是core dump。 当一个进程要异常终止时,可以选择把进程的用户空间内存数据全部保存到磁盘上,文件名通常是core,这叫做core dump-核心转储。进程异常终止时因为有BUG,比如非法访问内存导致段错误。事后可以用调试器检查core文件以查清错误原因,这叫做事后调试。 一个进程允许产生多大的core文件,取决于进程的Resource Limit。默认是原创 2018-04-13 14:11:33 · 3406 阅读 · 0 评论 -
Linux-打造自己的shell(支持输入输出重定向)
我们在学习了重新替换之后,就可以打造自己的shell程序。 用到的知识也是我们之前学过的一些知识。 首先需要将输入的命令行参数解析。然后创建子进程,父进程等待,子进程去执行我们想要他执行的程序,用execvp函数就可以实现了。 第一步:先实现基础版。#include <stdio.h>#include <stdlib.h>#include <unis...原创 2018-03-26 12:31:44 · 421 阅读 · 0 评论 -
Linux-进程间通信:消息队列
消息队列 之前学到了进程间通信主要是为了让两个毫不相关的进程之间看到一份公共的资源。 管道提供了进程之间数据流的传输。 消息队列提供了一个从一个进程向另外一个进程发送一块数据的方法。 每个数据块被认为是有类型的,接收者进程接受数据块是可以有不同的类型的。 消息队列的不足:每个消息的最大长度是有上限的,每个消息队列的总的字节数是有上限的,系统上消息队列的总数也是有上限...原创 2018-03-31 13:14:26 · 227 阅读 · 1 评论 -
Linux-进程通信:共享内存
共享内存共享内存是Linux中最快的ipc形式。不论是管道还是消息队列,要传递的数据都要通过内核,而共享内存只需要在内存中开辟一部分空间,将该空间映射到共享它的进程的地址空间。以后这些进程间通信就不再涉及到内核,也就是说进程不在执行进入内核的系统调用来传递彼此的数据。 可以在/usr/include/linux/shm.h中查看到该数据结构 相关函数这里的函数都可以类比之前的消息队列函数学习原创 2018-04-05 09:11:59 · 212 阅读 · 2 评论 -
Linux-进程间通信:实现信号量
信号量UNXI system v中的信号量系统调用是对PV原语的推广,在这些原语之上可同时进行多个操作,且增量和减量可大于1,内核自动完成所有操作,在完成操作前,任何进程都不能访问该信号量信号量由如下元素组成:信号量的当前值信号量上最后一个操作的pid等待该信号量的值大于当前值的进程数等待该信号量的值为0的进程数信号量实际是以集合的形式创建的,一个信号量集合中有一个或多个...原创 2018-04-05 10:46:09 · 235 阅读 · 1 评论 -
Linux-进程通信(管道)
进程间通信目的数据传输:一个进程需要将他的数据传输给其他进程。资源共享:多个进程之间共享相同的资源。通知事件:一个进程需要向另一个进程发送消息,通知它发生了某种事件。进程控制:有些进程希望完全控制另一个进程的执行,此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。管道管道是unix中最古老的进程间通信的方式。 管道的定义:我们把从一个进程连接到另一个进程的一原创 2018-03-28 16:04:51 · 197 阅读 · 0 评论 -
linux学习笔记(一)命令
Linux相关背景Linux是一种开源的类UNIX操作系统。该操作系统是由Linus在1991年首次发布。后来,再加上用户的应用程序,便成为了Linux操作系统。严格来讲,Linux只是该操作系统内核本身。 发行版本:Redhat,Ubuntu,Debian,CentOS,fedora,Kali…命令Linux下命令通常由命令+选项+参数组成。 1.ls:查看当前目录下文件与目录。-a:查看所原创 2018-02-25 15:02:15 · 245 阅读 · 0 评论 -
Linux学习笔记(二)权限
17,find:查找文件(可访问磁盘)-name :按文件名查找-atime:几天前打开-mtime:几天前修改…….(可通过man手册查询)如果find还希望执行动作: - -exec 命令 {} / - -ok 命令 {} / 18.grep:在文件中过滤字符串,找到需要的内容 结合这两个命令的功能,可以完全在工作中常常遇到的一个问题 在一个工程中找到某一个...原创 2018-02-26 15:56:27 · 201 阅读 · 0 评论 -
Linux学习笔记(三)vim使用
vim使用1.三种模式编辑模式命令模式末行模式2.基本操作vim test.c此时进入【命令模式】 按下 - a - i - o 进入【编辑模式】 按下 - Esc 进入【命令模式】 - 按下【shift+:】 进入末行模式3.命令集(命令模式下) 1).插入a:从当前光标所在位置的下一个位置开始输入o:在当前光标的下一行插空行O:在当前光标的上一行原创 2018-02-27 16:30:53 · 147 阅读 · 0 评论 -
模拟实现Linux命令-wc
模拟实现linux下一个小命令:wc #include <stdio.h>#include <stdlib.h>#include <ctype.h>int main(int argc,char *argv[]){ int c=0; int l=0; int w=0; int len=0; int i=0; int status=0; i原创 2018-02-27 17:18:13 · 3823 阅读 · 0 评论 -
Linux权限——粘滞位t与用户位t
在某些情况下,我们通常不希望所有访问该文件的用户都拥有权限对该文件内容修改或删除,但是文件的拥有者可以对文件做出修改和删除。简单来说,我们要防止一些Ctrl+x操作。粘滞位 我们通过ls命令查看到/目录下的一个目录-tmp目录,查看权限可以看到,本用户和本组用户的权限都是rwx,可读可写可执行,而对其他用户的权限是rwt 这个最后一位权限t就是我们所说的粘滞位。 如何测试: 比如我们在根目录原创 2018-02-28 15:12:08 · 546 阅读 · 0 评论 -
Linux-gcc编译器
gcc编译写好的代码如何变成一个可执行程序的呢? 总共分四步: 预处理—-编译—-汇编—-链接 每一步如何实现:预处理:gcc -E test.c -o test.i编译:gcc -S test.c -o test.s汇编:gcc -c test.c -o test.o这里:我们可以通过file命令查看得到test.i,test.s,test.o三个文件的类型。 - .i文件是原创 2018-02-28 16:52:04 · 206 阅读 · 0 评论 -
Linux调试器-gdb和valgrind
我们写代码时常常需要调试,Windows我们简单的用鼠标点点点就可以完成。在Linux下是如何使用调试? 首先需要调试器-gdb。(Linux的调试器不只有gdb一个,但是初学者可以先从这个使用学起)gdbgdb是UNIX及UNIX-like下的调试工具。 功能:启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)原创 2018-03-01 16:50:03 · 666 阅读 · 0 评论 -
Linux-makefile
makefilemake是一个命令工具,它解释Makefile 中的指令(应该说是规则)。在Makefile文件中描述了整个工程所有文件的编译顺序、编译规则。Makefile 有自己的书写格式、关键字、函数。像C 语言有自己的格式、关键字和函数一样。而且在Makefile 中可以使用系统shell所提供的任何命令来完成想要的工作。Makefile(在其它的系统上可能是另外的文件名)在绝大多数的...原创 2018-03-01 17:29:15 · 113 阅读 · 0 评论 -
yum安装gcc,gdb,gcc及vim配置
安装首先需要查看自己的系统有没有安装以上软件,使用which命令; 可以看到我的系统安装了以上软件,那么如何安装呢: 首先了解yum: Yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器。基于RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所原创 2018-03-05 10:45:25 · 2273 阅读 · 1 评论 -
实现Linux彩色进度条
我们在Linux下安装软件时经常会看到一个进度条,下面就来实现该进度条(c语言实现)实现效果: 代码如下: 觉得有点空洞,所以给它加上颜色 加上背景色: 如何给printf输入的字符串加上颜色? 格式如下(双引号里面没有加任何额外字符,”字符串”为要打印的内容):printf(“\033[字背景颜色;字体颜色m字符串\033[0m” ); 示例: printf(“...原创 2018-03-05 11:15:06 · 264 阅读 · 0 评论 -
Linux下安装软件的几种方式
RPM 包安装: 这种软件包如同Windows下的exe安装文件,在图形界面上双击即可安装。 卸载:首先要找到软件的全称,通常Linux下软件的名称都带有版本号,所以在卸载软件时需要先找到软件的全称:rpm -qa xxx*找到软件后,显示出来完整名称rpm -e xxx源码安装一般,这种包都是tar.gz或bz.2包,源码安装比较复杂,包里全部都是源代码,没有编译过的。需要经过编译才能够安装。原创 2018-03-05 17:30:40 · 3271 阅读 · 0 评论 -
模拟实现Linux下命令-ls
首先我们对Linux下ls命令已经非常熟悉了,我在这里用C语言仅实现ls -l及ls -l xxx。(仅作练习使用)首先需要了解ls -l命令都做了那些活动,那么就需要研究以下: 我们可以看到有七列主要内容,先来逐个分析:文件的类型,此图里所有文件均为目录,所以是d。权限=本用户权限+本组用户权限+其他用户权限硬链接数文件所输用户名 文件所输用户组名文件大小时间(这个时间是该文件最后一次原创 2018-03-08 15:28:22 · 546 阅读 · 0 评论 -
模拟实现Linux下cp命令
首先要了解cp命令,可以通过man手册进行查看。 接下来分析以下可能出现的几种情况: 以下是代码:#include <stdio.h>#include <unistd.h>#include <sys/stat.h>#include <stdlib.h>#include <string.h>#include <dirent.h>void cp_dir(const char *src原创 2018-03-08 15:47:16 · 2139 阅读 · 0 评论 -
Linux-查看进程
Linux的进程控制块之前已经介绍过进程控制块的概念,那么Linux下的进程控制块具体是一个怎么样的结构下面详细说明。 在Linux的操作系统中,PCB是一个叫做task_struct的结构体,其中的内容如下:标识符:与进程相关的唯一标识符,用来区分其他进程。状态:进程有不同的状态,例如运行,就绪,阻塞等。优先级:为了给处理机调度提供支持,优先级用来区分各种进程的先后执行顺序程序...原创 2018-03-13 18:21:43 · 197 阅读 · 0 评论 -
Linux-task_struct
Linux下进程用task_struct结构体表示,包含以下各类信息:状态:进程的执行状态(执行态,就绪态,挂起态,停止态,僵死态)调度信息:Linux进程调度所需要的信息,一个进程可能是实时的或普通的,并具有优先级。实时进程在普通进程前调度,且需要使用相关的优先级。一个计数器会记录允许进程执行的时间量。标识符:每个进程都有唯一的一个进程标识符,以及用户标识符和组标识符。组标识符用于给一组进程原创 2018-03-14 09:09:32 · 129 阅读 · 0 评论 -
Linux-僵尸进程,孤儿进程
Linux下进程状态Linux进程状态:R (TASK_RUNNING),可执行状态。 Linux进程状态:S (TASK_INTERRUPTIBLE),可中断的睡眠状态.Linux进程状态:D (TASK_UNINTERRUPTIBLE),不可中断的睡眠状态。 Linux进程状态:T (TASK_STOPPED or TASK_TRACED),暂停状态或跟踪状态。Linux进程状态:Z原创 2018-03-14 15:51:29 · 176 阅读 · 0 评论 -
Linux-环境变量
环境变量一般是指操作系统用来指定操作系统运行环境的一些参数。 例如:当我们再写c/c++代码时,我们并不知道库在哪里,程序链接时却能知道库在哪里并且链接。这是因为有相关环境变量帮助编译器进行查找。 环境变量一般除了具有某些特殊含义之外,还具有全局特性。下面是几个Linux下常见的环境变量:PATH:指定命令的搜索目录HOME:指定用户的主工作目录HISTSIZE:指保存历史命...原创 2018-03-15 13:35:40 · 126 阅读 · 0 评论 -
Linux-进程优先级
为什么要有优先级显然,在多任务操作系统中,进程占用cpu必须需要人为能够控制。 原因是因为:有的进程非常重要,有些进程当下来看没有那么重要。 所以就需要有优先级来区分他们。 进程是需要切换的,意味着在同一个调度周期中,优先级高的占用cpu的时间就长,优先级低的占用就短些。NI and PRI用ps -l命令可以查看以上字段,对他们都加以说明:F 代表这个程序的旗标 (flag), 4 代表使原创 2018-03-15 14:56:44 · 5463 阅读 · 0 评论 -
Linux-创建,终止,等待进程
创建进程forkLinux下用fork()函数创建进程。 在Linux下fork是一个非常重要的函数,他从已存在进程中创建一个新进程。新进程为子进程。而原进程为父进程。 举例说明:#include <stdio.h>#include <unistd.h>#include <sys/types.h>int main(){ int ret=fork(); printf("pr原创 2018-03-18 22:12:30 · 161 阅读 · 0 评论 -
Linux-程序替换
替换原理用fork创建子进程,往往子进程要和父进程执行相同的程序,虽然也有可能时执行不同的代码分支,但是父子进程执行的都是同一程序。原因fork函数创建子进程,代码共享,数据写时拷贝。 那么假想,能不能让fork创建出来的子进程去执行另外一个程序呢。 答案是可以的。 当子进程去调用一种exec(系统调用)函数,就可以去执行另外一个程序。当进程调用exec函数时,该进程的代码与数据完全被新的程序原创 2018-03-22 16:23:40 · 228 阅读 · 0 评论 -
Linux-popen,system函数差异
popen在linux下,不懂得可以查看帮助手册,我们先看看man手册怎么说。 可以看到,手册给出了两个函数原型,popen与pclose,其实我们很容易就能联想到另外一组函数,fopen,fclose。这两个函数是用来打开关闭文件的。所以其实我们已经可以猜到popen,pclose这两个函数的作用是什么了,p在linux下我们见到的地方大多数都与“管道”与关,所以可想而知,这两个函数实现的功原创 2018-03-22 17:44:02 · 569 阅读 · 0 评论 -
Linux-文件描述符
相关系统调用接口我们在学习c语言时,在学习i/o操作时,用到的相关c接口:fopen,fclose,fread,fwrite等等,我们都称之为c库函数。 不止c语言有这些接口,其他语言也有,但是实际上不管是哪种语言,最终他们都会采用系统调用的方式来进行文件访问。 下面,介绍与i/o相关的系统调用。open #include <sys/types.h> ...原创 2018-03-22 22:37:01 · 214 阅读 · 0 评论 -
Linux-输入/输出重定向
重定向我们在用echo曾经用过重定向,但是对重定向并不是非常清楚。下面来解释重定向到底是什么原理。 我们可以尝试把文件描述符的1关闭掉。#include <stdio.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>int main(){ close(1); int fd=open("txt",O原创 2018-03-23 10:49:12 · 477 阅读 · 0 评论 -
Linux-自己创建动态库静态库
动态库和静态库区分以下四个概念: 静态库:程序在编译链接时候把库的代码链接到可执行代码中,程序运行时将不再需要静态库。 动态库:程序在运行时才去链接动态库的代码,多个程序可共享使用库的代码。 静态链接:即在链接阶段,将源文件中用到的库函数与汇编生成的目标文件.o合并生成可执行文件。通常具有内存扩大,但具有可移植性。 动态链接:l动态链接所调用的库函数代码并没有拷贝到程...原创 2018-03-25 15:26:03 · 178 阅读 · 0 评论