linux编程
hj605635529
海阔任鱼跃,天高任鸟飞!!
展开
-
进程和线程的区别与联系
一、进程进程:指在系统中能独立运行并作为资源分配的基本单位,它是由一组机器指令、数据和堆栈等组成的,是一个能独立运行的活动实体。 注意,进程一般有三个状态:就绪状态、执行状态和等待状态【或称阻塞状态】;进程只能由父进程建立,系统中所有的进程形成一种进程树的层次体系;挂起命令可由进程自己和其他进程发出,但是解除挂起命令只能由其他进程发出。进程控制块(PCB):P原创 2017-04-12 13:22:06 · 292 阅读 · 0 评论 -
反引号与$()的区别以及eval的作用
$( )与` `(反引号)在bash shell中,$( )与` `(反引号)都是用来做命令替换(command substitution)用的。命令替换:echo pwd 这里的pwd就是一个字符串不是命令,所以输出的就是pwd这个字符串,$()和反引号将字符串解释成命令了,用$( )的理由1. ` `很容易与' '(单引号)搞混。有时在一些原创 2017-06-22 00:39:48 · 1306 阅读 · 0 评论 -
Linux 多线程同步之哲学家用餐问题分析
有五个哲学家公用一张餐桌,分别坐在周围的五张椅子上,在餐桌上有五个碗和五只筷子,他们的生活方式是交替地进行思考和用餐。平时,一个哲学家进行思考,饥饿时便试图拿取其左右最靠近他的筷子,只有在他拿到两只筷子时才能进餐,进餐完毕,放下筷子继续思考。思路:选用互斥锁mutex,如创建5个, pthread_mutex_t m[5];模型抽象: 5个哲学家 --> 5个线程;5支筷子 -原创 2017-06-11 19:55:07 · 2823 阅读 · 1 评论 -
mmap实现多进程对大文件拷贝
实现文件多进程拷贝。假设有一个超大文件,需对其完成拷贝工作。为提高效率,可采用多进程并行拷贝的方法来实现。假设文件大小为len,共有n个进程对该文件进行拷贝。那每个进程拷贝的字节数应为len/n。但未必一定能整除,我们可以选择让最后一个进程负责剩余部分拷贝工作。可使用len % (len/n)将剩余部分大小求出。为降低实现复杂度,可选用mmap来实现源、目标文件的映射,通过指针操作内存地址原创 2017-06-11 22:50:28 · 1176 阅读 · 1 评论 -
linux下用c语言实现一个简单的线程池
首先大家思考一个问题:为什么需要内存池?我们知道应用程序创建一个对象,然后销毁对象是很耗费资源的。创建线程,销毁线程,也是如此。因此,我们就预先生成一些线程,等到我们使用的时候在进行调度,于是,一些"池化资源"技术就这样的产生了。1 线程池优点下面使用网上资源验证线程池如何提高服务器性能的。多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单原创 2017-06-23 21:08:54 · 4003 阅读 · 3 评论 -
centos下如何安装rar和unrar软件
如果您的centos是32位的,执行如下命令wget http://www.rarsoft.com/rar/rarlinux-3.9.3.tar.gztar -zxvf rarlinux-3.9.3.tar.gzcd rarmake看见下面这些信息就是安装成功了:mkdir -p /usr/local/binmkdir -p /usr/local/libcp rar unrar原创 2017-07-03 23:13:38 · 436 阅读 · 0 评论 -
mmap映射区和shm共享内存的区别总结
linux中的两种共享内存。一种是我们的IPC通信System V版本的共享内存,另外的一种就是我们今天提到的存储映射I/O(mmap函数)在说mmap之前我们先说一下普通的读写文件的原理,进程调用read或是write后会陷入内核,因为这两个函数都是系统调用,进入系统调用后,内核开始读写文件,假设内核在读取文件,内核首先把文件读入自己的内核空间,读完之后进程在内核回归用户态,内核原创 2017-06-13 11:45:24 · 26319 阅读 · 12 评论 -
linux下静态库和动态库的创建和使用
一》静态库的创建和使用: 静态库的制作1>. 命名规则1). lib + 库的名字 + .a2). libmytest.a2>. 制作步骤:1). 生成对应的.o文件 -- .c --> .o -c2). 将生成的.o文件打包 ar rcs + 静态库的名字(libMytest.a) + 生成的所有的.o3>. 发布和使用静态库:1). 发布原创 2017-07-05 13:58:59 · 725 阅读 · 0 评论 -
用shell脚本实现一个彩色的进度条
演示:代码如下:#!/bin/bashindex=('|' '/' '-' '\\') #定义一个字符数组bar='#'i=0while [ $i -le 100 ]do let colour=30+i%8 echo -en "\e[1;"$colour"m" printf "[%-100s][%d][%c]\r" "$bar"原创 2017-07-07 15:26:58 · 443 阅读 · 0 评论 -
用shell脚本语言实现一个斐波那契数列的递归和非递归版本
代码:#!/bin/bash -x#第一种写法#first=1#second=1#last=1##if [ $1 -le 2 ];then# echo 1#fi##i=3#while [ $i -le $1 ]#do# let last=first+second# let first=second# let second=last# let i++#done原创 2017-07-08 00:57:23 · 4791 阅读 · 2 评论 -
如何用shell脚本语言去截取字符串
shell中几种常用截取字符串的方法 一. 概念 在shell中通过截取字符串操作可以提取到我们所需要的特定字符串 假设变量str=http://blog.csdn.net/hj605635529/article/details/73556855二. 操作符 ① #表示 从左截取,删除左边字符,保留右边字符#!/bin/bashstr=http://blog.csdn.net/hj60原创 2017-07-09 00:22:39 · 821 阅读 · 0 评论 -
linux定时任务crontab命令和crond服务详解
linux 系统则是由 cron (crond) 这个系统服务来控制的。Linux 系统上面原本就有非常多的计划性工作,因此这个系统服务是默认启动的。另 外, 由于使用者自己也可以设置计划任务,所以, Linux 系统也提供了使用者控制计划任务的命令 :crontab 命令。 一、crond简介 crond 是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows原创 2017-07-09 12:22:37 · 5590 阅读 · 1 评论 -
linux下gzip,bzip2,tar,zip,rar压缩与解压缩命令总结
1. 压缩包管理1>. 屌丝版:1). gzip -- .gz格式的压缩包(不会保留源文件 不会打包 gz结尾 不能压缩目录)2). bzip2 -- .bz2格式的压缩包(不会保留源文件(-k能保存源文件),不会打包 bz2结尾 不能压缩目录)2>. 高富帅版:1). tar -- 不使用z/j参数 , 该命令只能对文件或目原创 2017-07-03 22:34:22 · 387 阅读 · 0 评论 -
vim/vi常用的快捷方式
一些像jkhl,dd,yy这种简单的快捷方式就不说了,说些稍微用点复杂的快键键:1.如何进行多行注释: 1.按ctrl+v进入visual block模式 2.选择要注释的行 3.大写的i进入插入模式 4.Esc退出。2.删除多行注释: 1.按ctrl+v进入visual block模式 2.选择要删除注释的行 3.按小写的d3.删除一行中某些原创 2017-07-09 17:23:46 · 494 阅读 · 0 评论 -
linux free命令详解: cache和buff的区别
Linux系统上,常用free命令查看内存的使用情况,本文主要为你介绍free命令的输出结果:解释一下linux上free命令的输出。 下面是free的运行结果,一共有4行。为了方便说明,我加上了列号。这样可以把free的输出看成一个二维数组FO(Free Output)。例如:FO[2][1] = 24677460FO[3][2] = 10321516转载 2017-08-13 17:05:39 · 2438 阅读 · 1 评论 -
为rm命令添加一个垃圾回收站
背景用rm删除文件的同时会删除inode信息,这使得使用rm删除的文件很难恢复。特别是带有-rf参数时,一定要慎之又慎。 我希望用rm删除的文件(夹)可以在回收站找到。本文就教你实现这个功能。 方法: 1. 在/home/username/ 目录下新建一个目录,命名为:.trash 2.新建一个shell文件,命名为: saferm.sh,内容如下:#!/bin/bash###...原创 2018-06-16 13:18:11 · 738 阅读 · 2 评论 -
shell脚本基础知识
shell脚本 入门 —— 符号篇shellShell就是一个命令行解释器 ,它的作用是解释执行用户的命令,用户输入一条命令,Shell就解释执行一条,这种方式称为交互式(Interactive)。Shell还有一种执行命令的方式称为批处理 (Batch),用户事先写一 个Shell脚本 (Script),其中有很多条命令,让Shell一次把这些命令执行完,而不原创 2017-06-21 17:41:42 · 257 阅读 · 0 评论 -
守护进程的实现
守护进程也叫做精灵进程,是运行在后台的一种特殊的进程,它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。生存周期长,它们常常在系统引导装入的时候启动,仅仅在系统关闭的时候才终止。因为它们没有控制终端,所以说它们是在后台运行的。很多服务器的应用都和守护进程相关守护进程的特点: 守护进程启动后没有控制终端,不能直接和用户交互。 守护进程不受用户登录注销的影响。只受开机关机的原创 2017-06-04 17:20:03 · 497 阅读 · 0 评论 -
进程间通信之共享内存
1.概念:共享内存就是多个进程的地址空间映射到同一个物理内存,多个进程都能看到这块物理内存,共享内存可以提供给服务器进程和客户进程之间进行通信,不需要进行数据的复制,所以速度最快。2.共享内存操作需要的函数:(1)我们需要利用ftok函数生成key标识符。key_t ftok(const char *pathname,int proj_id).(2)我们使用shmgt函数,创建原创 2017-03-28 15:05:47 · 2778 阅读 · 0 评论 -
进程间通信--信号量
前言在这我们需要提出一些概念: 临界区:指的是访问临界资源的程序代码片段。临界区只能允许一个进程进入。 临界资源:临界资源说的是一次只能提供一个进程使用的资源。 互斥:互斥是指某一个资源同时只允许一个访问者对其进行访问。 原子性:一个事务包含多个操作,这些操作要么全部执行,要么全都不执行。 加锁:这里的加锁就是给临界区加锁,也叫做互斥锁,用来保护临界区。因为两个进程同时原创 2017-03-15 16:44:49 · 236 阅读 · 0 评论 -
linux下验证管道的容量
验证管道大小思路:写端一直写,读端不读,当写满了,写端阻塞,就可以统计出管道的大小了。#include#include#include#include//匿名管道 单向的,只能用于有血缘关系的,常用于父子进程。int main(){ int pipefd[2] = {0,0}; if (pipe(pipefd) < 0)//int pipe(int pipefd[2])原创 2017-03-09 11:58:57 · 632 阅读 · 0 评论 -
linux下vim的配置
原创 2017-02-16 13:17:57 · 266 阅读 · 0 评论 -
linux下三个时间与find命令
一:(1)mtime:当文件的“内容数据”更改时,就会更新这个时间。内容数据指的是文件的内容,而不是文件的属性或权限。(2)ctime当该文件的状态改变时,就会更新这个时间,举例来说,像是权限与属性被更改了,都会更新这个时间。(3)atime当“该文件的内容被取用”时,就会更新这个读取时间。举例来说,我们使用cat去读取/etc/man.config,就会更新该文件atim原创 2017-02-15 11:55:10 · 5911 阅读 · 0 评论 -
简单实现一个进度条并剖析原理
1.前言我们要实现关于一个进度条,我们的想法是采用for循环的方式,所以对于这个进度条,我们需要从下面几个问题来一一看待问题。2.关于 ‘\n’ 与 ‘\r’这两个符号,一个叫做回车,一个叫做换行,好多人对这两个分不清,所以我们在这里需要介绍一下。 在最早的时候,只有打字机的时候,人们在每行的后面加上两个表示结束的字符,一个叫做回车,它把打字机的光标定位在左边界,另原创 2017-02-17 10:57:42 · 3961 阅读 · 0 评论 -
操作系统进程调度算法
今天我们来谈一谈进程调度算法:1. 先来先服务调度算法(FCFS)先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法既可用于作业调度,也可用于进程调度。当在作业调度中采用该算法时,每次调度都是从后备作业队列中选择一个或多个最先进入该队列的作业,将它们调入内存,为它们分配资源、创建进程,然后放入就绪队列。在进程调度中采用FCFS算法时,则每次调度是从就绪队列中选择一个最原创 2017-02-19 11:48:55 · 893 阅读 · 0 评论 -
进程管理—进程描述符(task_struct)
当把一个程序加载到内存当中,此时,这个时候就有了进程,关于进程,有一个相关的叫做进程控制块(PCB),这个是系统为了方便进行管理进程所设置的一个数据结构,通过PCB,就可以记录进程的特征以及一些信息。 内核当中使用进程描述符task_struct。 这个task_struct就是一个定义的一个结构体,通过这个结构体,可以对进程的所有的相关的信息进行维护,对进程进行管理。接下来我们需原创 2017-02-21 00:33:57 · 208 阅读 · 0 评论 -
Linux中的系统调用及文件结构体成员
一、atexit函数atexit()注册的函数类型应为不接受任何参数的void函数,exit调用这些注册函数的顺序与它们 登记时候的顺序相反。同一个函数如若登记多次,则也会被调用多次。#include #include stdlib.h> void exit_fn1(void) { printf("Exit function #1 called\原创 2017-02-21 00:47:57 · 375 阅读 · 0 评论 -
死锁四个必要条件及死锁的预防、检测、避免、解除
死锁:我们先来思考一个问题:我们加锁以后,再次进行加锁,这样会发生什么?当我们第二次申请锁的时候,这个时候锁已经被占用了,该线程就会被挂起,但是刚好这个线程就是拥有锁的线程了,那么这个线程就永远挂起等待了,这个我们就叫死锁。1.死锁发生的情形:(1)一个线程两次申请锁。(2)两个线程互相申请对方的锁,但是对方都不释放锁。2.死锁产生的必要条件:(1) 互原创 2017-04-04 23:26:05 · 16985 阅读 · 2 评论 -
线程安全与可重入函数的关系
线程安全:一般来讲就是一个代码块被多个并发线程反复调用时会一直产生正确的结果。线程安全问题都是由全局变量及静态变量引起的。任何未使用静态数据或其他共享资源的函数都是线程安全的。而使用全局变量或静态局部变量的函数是非线程安全的。 使用静态数据或其他共享资源的函数,必须通过加锁的方式来使函数实现线程安全。线程安全函数解决多个线程调用函数时访问共享资源的冲突问题。原创 2017-05-02 13:42:09 · 1315 阅读 · 0 评论 -
linux下模拟实现sleep以及sleep会出现的问题解决方案
linux下的sleep这个函数相信我们都不陌生了,它的作用就是让程序休眠一定的秒数,到时间后自动恢复。这里我们主要用到三个函数:(1)alarm()函数 #include unsigned int alarm(unsigned int seconds);采用alarm()函数设定需要睡眠的秒数,到时间后闹钟会发送SIGALRM信号给当前进程。但SIGALR原创 2017-05-02 14:32:59 · 4569 阅读 · 0 评论 -
线程的创建、等待、终止、分离、同步和互斥
线程的概念:线程就是进程的若干个执行流有些情况需要在⼀个进程中同时执 ⾏多个控制流程,这时候线程就派上了⽤场,⽐如实现⼀个图形界⾯的下载软件,⼀⽅⾯需要和⽤ 户交互,等待和处理⽤户的⿏标键盘事件,另⼀⽅⾯又需要同时下载多个⽂件,等待和处理从多个 ⽹络主机发来的数据,这些任务都需要⼀个“等待-处理”的循环,可以⽤多线程实现,⼀个线程专门 负责与⽤户交互,另外⼏个线程每个线程负责和⼀个原创 2017-03-28 13:40:52 · 462 阅读 · 0 评论 -
生产者与消费者模式(线程的同步与互斥)
条件变量条件变量的提出首先要涉及一个概念,就是生产者消费者模型:生产者消费者,是在多线程同步的一个问题,两个固定大小缓冲区的线程,在实际运行是会发生问题,生产者是生成数据放入缓冲区,重复过程,消费者在缓冲区取走数据。生产者消费者的模型提出了三种关系,两种角色,一个场所三种关系: - 生产者之间的互斥关系 - 消费者之间的竞互斥关系 - 生原创 2017-04-05 15:27:07 · 6279 阅读 · 0 评论 -
读写锁解决读者与写者问题
读写锁是用来解决读者写者问题的,读操作可以共享,写操作是排他的,读可以有多个在读,写只有唯一个在写,同时写的时候不允许读。在编写多线程的时候,有一种情况是比较常见的。那就是,有些公共数据修改的机会比较少。相较改写,它们读的机会反而多的多。读者写者模式:三种关系,两类人,一个场所三种关系: 读者与读者:无关系 写者与写者:互斥原创 2017-04-12 12:50:29 · 3344 阅读 · 1 评论 -
ubuntu16.04如何安装最新的nginx
Ubuntu 16.04安装Nginx在Ubuntu下安装Nginx有以下方法,本文介绍的是如何通过apt-get安装最新的nginx,此方法快速简洁,下面是安装nginx的步骤:在/etc/apt目录下下载nginx_signing.key wget http://nginx.org/keys/nginx_signing.key sudo apt-key add ngi...原创 2018-06-19 21:27:33 · 4048 阅读 · 1 评论