Linux
董丹丹第100号
一个学渣属性的技术渣
展开
-
vim配置
vim配置是在主工作目录下,先touch两个文件.vim和.vimrc,再给.vimrc中添加内容。set helplang=cn set encoding=utf-8 set cscopequickfix=s-,c-,d-,i-,t-,e- nmap <C-_>s :cs find s <C-R>=expand("<cword>")<CR><CR> nmap <C-_>g :cs原创 2017-04-15 21:45:36 · 231 阅读 · 0 评论 -
shell脚本实现字符串截取
shell脚本截取字符串有8种方法: 1.# 号截取,删除左边字符,保留右边字符。代码: ch=abcd1234 echo ${ch#*d}其中 ch 是变量名,# 号是运算符,*d 表示从左边开始删除第一个 字符d 及左边的所有字符 结果是 :1234 2.## 号截取,删除左边字符,保留右边字符。 代码:echo ${ch##*,} ##*, 表示从左边开始删除最后(最右边)一个原创 2017-07-05 17:26:01 · 9597 阅读 · 0 评论 -
进程池和线程池
用new、malloc申请内存时,由于每次申请的大小不同,最后可能导致会有许多内存碎片无法使用,造成内存浪费和不好管理的问题。内存池则是在真正使用内存之前,先申请分配一定数量的、大小相等的内存块留做备用。当有新的内存需求时,就从内存池中分出一部分内存块,若内存块不够则继续申请新的内存。这样做有效的避免了内存碎片,提高了内存使用效率。而进程池(线程池与进程池的概念基本一致)就引用了内存池的思想,由服务原创 2017-06-27 15:25:44 · 333 阅读 · 0 评论 -
Linux下的eval、` `与$()
1.eval cmdlineeval会对cmdline进行两遍扫描,第一遍扫描后,如果cmdline是一条普通命令,则执行该命令;如果cmdline中含有变量的间接引用,则保证间接引用的语义。 例如: 如果没有eval: shell第1次扫描命令行时,它替换出pipe的值|,接着eval使它再次扫描命令行,这时shell把|作为管道符号了。2.eval echo $$#取得最后一个参数原创 2017-06-27 16:57:19 · 542 阅读 · 0 评论 -
子进程退出时会给父进程发信号吗?
父进程创建一个子进程,那么子进程退出时,会不会告诉父进程它要退出了?其实在子进程退出时,会给父进程发送一个SIGCHLD,17号信号。 那么下面用代码来验证一下: 首先要捕捉SIGCHLD信号,输出 i am %d signal ; 再创建子进程,在子进程中输出 i am child,然后退出; 在父进程中每隔1s输出 i am father。#include <unistd.h>#in原创 2017-06-14 15:56:08 · 7688 阅读 · 0 评论 -
父进程异步等待子进程
父进程自定义SIGCHLD信号的处理函数,并采用非阻塞方式等待,当子进程退出时,会向父进程发送信号,父进程会进行回收。 当有10个子进程退出时,会给父进程发送10个信号,但由于只会记录一次,所以只能回收一次,我们让父进程一直回收,当子进程全部被回收,waitpid()返回-1,跳出循环。#include <unistd.h>#include <stdio.h>#include <std原创 2017-06-14 16:17:18 · 386 阅读 · 0 评论 -
线程安全
假设一种情况,编写mysleep()函数。#include <stdio.h>#include <unistd.h>#include <signal.h>void myhandler(int sig){ printf("%d signal\n", sig);}int mysleep(int timeout){ struct sigaction act, oact;原创 2017-06-14 17:13:20 · 238 阅读 · 0 评论 -
可重入函数
重入:是指被两个或多个执行流重复进入。 假设在链表向头结点_pHead插入节点_Node1时,插入动作分两步,一是将_Node1->_pNext = _pHead->_pNext,二是_pHead->_pNext = _Node1,如果在完成第一步后,因为硬件中断使进程切换到内核,再次回到用户态前检查到有信号要处理,于是切换到sighandler()函数,sighandler()也调用insert原创 2017-06-14 17:32:03 · 178 阅读 · 0 评论 -
信号屏蔽与信号递达
信号递达(handler):实际执行信号的处理动作, 信号未决(pending):信号从产生到递达之间的状态, 信号阻塞(block):被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞,才执行递达的动作。 【注意】:阻塞和忽略是不同的,只要信号被阻塞,就不会递达,而忽略是在递达之后会选择的一种动作。 对于信号1:没有阻塞,也没有产生过,如果递达则执行默认动作; 对于信号2原创 2017-06-15 16:30:44 · 356 阅读 · 0 评论 -
Linux下线程的创建与等待
Linux下的进程是在各自独立的地址空间中运行,进程间共享数据需要进程间通信机制,这种机制非常不方便,并且有的时候需要一个进程同时执行多个执行流,这时就引入了线程的概念。 线程是在进程的地址空间内部运行的一个执行分支,它们之间共享进程内部的资源,所以代码段和数据段都是共享的。 那么线程有哪些东西是自己独有的呢? 1.线程id(标识了各个不同的线程); 2.上下文信息(离开CPU时的信息,方便原创 2017-06-15 17:47:09 · 359 阅读 · 0 评论 -
线程的分离与结合
线程是可结合或分离的。一个可结合的线程能够被其他线程收回资源和杀死。相反,一个分离的线程是不能被其他线程收回或杀死的,它的存储器资源在它终止时由系统自动释放。 默认情况下,线程被创建为可结合的。 线程分离函数:int pthread_detach(pthread_t thread); 由于调用pthread_join后,如果该线程没有运行结束,调用者会被阻塞,但有些情况并不希望如此,所以可以在原创 2017-06-15 18:03:38 · 759 阅读 · 0 评论 -
Linux下的crond和crontab
定时任务软件种类at:适合仅执行一次就结束的调度命令,需要启动一个后端的atd服务。 crontab:需要启动一个服务crond才行,crond服务通过crontab命令实现。anacron:无法周期性执行,只能以天为周期,但有个特点,在关机状态下未>执行的任务,下次开机时可以补上执行。crond 与crontab的区别crond:crond是Linux系统用来定期执行命令或指定程序的服务的原创 2017-07-05 16:33:01 · 860 阅读 · 0 评论 -
Linux下的sed、awk、cut、sort、uniq工具
sedsed:流式编辑器,在shell脚本中作为过滤器,即将前一个程序的输出作为sed的输入,经过一系列编辑命令转换为另一种格式输出。 sed的基本格式: sed ‘pattern(正则表达式)/action(动作)’ file(文件名) sed -f scriptfile(脚本文件) file sed处理的文件既可以由标准输入重定向,也可以当命令行参数传入,一次传入多个文件,sed会依次原创 2017-07-04 17:15:27 · 842 阅读 · 0 评论 -
匿名管道的四种情况
匿名管道的4种情况: 1.如果所有指向管道写端的文件描述符都关闭了(管道写端的引用计数等于0),而仍有进程从管道的读端读取数据,那么管道中剩余的数据都被读取后,再次read会返回0,就像读到文件末尾一样。 1 #include <sys/types.h> 2 #include <sys/w原创 2017-06-12 16:52:45 · 1620 阅读 · 0 评论 -
Linux下的简易进度条
今天是在Linux下实现一个建议进度条,进度条是给一个空的字符串不断的写入字符来表明完成的进度,每隔10^-3时间更新一次输出缓冲区,使进度条不断地刷新。 1 #include <stdio.h> 2 #include <unistd.h> 3 #include <string.h> 4 int main() 5 {原创 2017-04-15 21:33:56 · 190 阅读 · 0 评论 -
黏滞位的作用以及如何设置
当我们用root用户创建一个目录并将其权限设置为000时,普通用户没有任何权限来修改该目录,但是却有删除的权限,为了防止普通用户误删一些重要的文件,Linux就提出了黏滞位的概念。 黏滞位的作用就是在给文件加上黏滞位后,只有超级用户或文件自身拥有者才能移动、修改或删除该目录,避免了其他用户修改一些重要文件。 1.先用root用户mkdir一个新目录dir1并将权限设为000,切换至普通用户,删除原创 2017-04-15 16:44:11 · 463 阅读 · 0 评论 -
Linux的find命令
Linux中的find命令用于在目录结构中搜索文件。命令格式find pathname -options [-print -exec -ok …]命令参数pathname: find命令所查找的目录路径。 -print: find命令将匹配的文件输出到标准输出。 -exec: find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为‘command’{} \;注意{}和原创 2017-04-15 16:12:48 · 253 阅读 · 0 评论 -
Linux下的三个时间的含义
使用命令stat可以查看文件的三个时间,而这三个时间又都有什么意义呢? 下面逐一进行验证: 使用vi命令进入文件,保存并退出后,三个值都发生改变: Access: 使用cat命令查看文件内容,只修改了Access值,其余两个值没有变化,所以Access表示文件最后一次访问时间。 Modify: 使用echo命令在test.c文件后添加内容,会同时修改Modify和Chan原创 2017-03-30 11:23:22 · 665 阅读 · 0 评论 -
Linux目录权限
要测试权限,首先要把目录的权限改为000,在分别给他赋予某种权限,若能进入该目录则说明,进入一个目录需要该权限。普通用户 1.去掉所有权限 2.测试是否能进入该目录: 权限不足 3.赋予读权限,并进入: 权限不足 4.赋予写权限,并进入: 权限不足 5.赋予执行权限,并进入: 执行权限可以进入该目录,但不可以读取该目录中的文件。 6.可读可执行权限:原创 2017-03-30 10:43:27 · 380 阅读 · 0 评论 -
FILE结构体与文件描述符
FILE类在编程语言中的应用是很广泛的,如果只是想简单的使用FILE类来读文件进行读写,那么可以不用了解的很深,但是也要知道FILE中都定义了那些变量以及为什么要定义这些变量。struct _iobuf { char *_ptr; //文件输入的下一个位置 int _cnt; //当前缓冲区的相对位置 char *_base; //指基础位置(即是文件的其始位置)原创 2017-05-11 17:18:46 · 397 阅读 · 0 评论 -
写一个自己的shell界面
1 #include <stdio.h> 2 #include <sys/types.h> 3 #include <sys/wait.h> 4 #include <unistd.h> 5 int main() 6 { 7原创 2017-05-11 17:57:58 · 1489 阅读 · 0 评论 -
shell脚本编写小程序
求1-100的加法,并输出1+2+3+4+5+6+7+…+100?#!/bin/bashsum=1str='1'i=2for (( i; i<=100; i++))do str=$str'+'$i let sum+=idoneecho $str=$sum因为‘+’不好处理,所以从2开始。 2.输入n个数字,判断最大最小值#!/bin/bashfunction m原创 2017-06-29 16:03:09 · 5331 阅读 · 0 评论 -
Linux下正则表达式的使用及grep工具
正则表达式规定一些特殊语法表示字符类、数量限定符和位置关系,然后用这些特殊语法和普通字符一起表示一个模式。字符类 例如: 匹配电话号码的正则表达式:1[3578][0-9]{9}。 表示第一位是1,第二位是3、5、7、8中的一个,后面9位都是0-9中的一位。 2. 数量限定符3.位置限定符 4.其他特殊字符 grepgrep是一种查找过滤工具,正则表达式在grep中用来查找符合模式的字符原创 2017-06-30 17:12:39 · 586 阅读 · 0 评论 -
进程通信之管道
管道通信分为两种,一种是匿名管道,另一种是命名管道,对于这两种管道有什么区别呢? 匿名管道,顾名思义就是没有名字,他只能让拥有血缘关系的两个进程进行通信,它是让两个进程分别连接管道的读端和写端,将数据保存在该管道内,两个进程就都能看到这些信息了。 因为匿名管道不能让两个没有血缘关系的进程通信,那么这些进程想要通信要怎么办呢?所以命名管道就出现了。 命名管道可以让两个毫无关系的进程进行通信,它是原创 2017-06-12 15:55:35 · 231 阅读 · 0 评论 -
线程死锁
什么是死锁线程A需要资源X,而线程B需要资源Y,而双方都掌握有对方所要的资源,这种情况称为死锁。死锁产生的4个必要条件是什么1.互斥:存在这样一种资源,它在某个时刻只能被分配给一个执行绪(也称为线程)使用; 2.请求与保持:当请求的资源已被占用从而导致执行绪阻塞时,资源占用者不但无需释放该资源,而且还可以继续请求更多资源; 3.不抢占和不剥夺:执行者执行完成前不可被剥夺资源,只有资源占用者自己才原创 2017-06-15 18:29:08 · 230 阅读 · 0 评论