Unix/Linux
文章平均质量分 55
蓝旭晨枫
无论这个世界对你怎样,都请你一如既往的努力、勇敢、充满希望
展开
-
调试器工作原理之二——实现断点
调试器工作原理之二——实现断点2013-01-02 00:14 2187人阅读 评论(0) 收藏 举报 分类:c(103) 汇编(26) 转自:http://blog.jobbole.com/23632/本文是关于调试器工作原理探究系列的第二篇。在开始阅读本文前,请先确保你已经读过本系列的第一篇(基础篇)。本文的主要内容转载 2016-08-23 09:44:10 · 704 阅读 · 0 评论 -
Linux下关机命令,shutdown -r now reboot及halt命令的区别
在linux命令中reboot是重新启动shutdown -r now是立即停止然后重新启动都说他们两个是一样的,其实是有一定的区别的。shutdown命令可以安全地关闭或重启Linux系统,它在系统关闭之前给系统上的所有登录用户提示一条警告信息。该命令还允许用户指定一个时间参数,可以是一个精确的时间,也可以是从现在开始的一个时间段。精确时间的格原创 2016-04-09 20:15:29 · 2449 阅读 · 0 评论 -
认识 EXT2 文件系统、磁盘分区 ( Partition )、文件系统:
认识 EXT2 文件系统既然这个章节主要在探讨 Linux 的磁盘文件系统,所以我们当然就需要先来了解一下硬盘是个什么东西啦! 首先,我们就来看一看硬盘的物理组成,了解了物理组成之后,再来说明一下怎么样进行硬盘的分割 (partition) 吧!硬盘物理组成:就硬盘的物理组件来说,硬盘其实是由许许多多的圆形硬盘盘所组成的, 依据硬盘盘能够容纳的数据量,而有所谓的单碟 (一块转载 2016-04-09 19:42:44 · 641 阅读 · 0 评论 -
Linux下硬链接和软链接
连结档的介绍: ln什么是连结档呢?其实连结档有点类似 Windows 底下的『快捷方式』!也就是很多的连结档案( link file )其实都指向同一个来源档案( source file )!不过,在所有的文件类型当中, 连结档算是比较难理解的一部份了!因为连结档还分成 Hard link 与 symbolic link 两种,这两种连结档在架构上是完全不一样的咚咚,底下就来好好的谈一谈转载 2016-04-09 19:45:08 · 475 阅读 · 0 评论 -
script 的运行方式差异 (source, sh script, ./script)
1、使用直接运行的方式运行script:会在子程序中(新的shell)中运行2、使用source命令来运行脚本:会在父程序中运行原创 2016-04-09 19:48:34 · 314 阅读 · 0 评论 -
Docker基础技术:Linux Namespace(下)
Docker基础技术:Linux Namespace(下)2015年4月16日陈皓发表评论阅读评论12,394 人阅读 在 Docker基础技术:Linux Namespace(上篇)中我们了解了,UTD、IPC、PID、Mount 四个namespace,我们模仿Docker做了一个相当相当山寨的镜像。在这一篇中,主要想向大家介绍Linux的User和Net转载 2016-04-07 18:46:10 · 586 阅读 · 0 评论 -
全局偏移表(GOT)和过程链接表(PLT)
1、全局偏移量表GOT表ELF 格式的共享库使用 PIC 技术使代码和数据的引用与地址无关,程序可以被加载到地址空间的任意位置。 PIC 在代码中的跳转和分支指令不使用绝对地址。 PIC 在 ELF 可执行映像的数据段中建立一个存放所有全局变量指针的全局偏移量表GOT表2、对于模块外部引用的全局变量和全转载 2016-04-07 14:23:41 · 3256 阅读 · 0 评论 -
静态库和动态库的区别
函数库分为静态库和动态库两种。 静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。 动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。 本文主要通过举例来说明在Linux中如何创建静态库和动态库,以及使用它们。 在创建函数库前,我们先来准备举例用转载 2016-04-07 18:51:00 · 387 阅读 · 0 评论 -
Docker基础技术:Linux Namespace(上)
时下最热的技术莫过于Docker了,很多人都觉得Docker是个新技术,其实不然,Docker除了其编程语言用go比较新外,其实它还真不是个新东西,也就是个新瓶装旧酒的东西,所谓的The New “Old Stuff”。Docker和Docker衍生的东西用到了很多很酷的技术,我会用几篇 文章来把这些技术给大家做个介绍,希望通过这些文章大家可以自己打造一个山寨版的docker。当然,文章的转载 2016-04-07 18:43:34 · 467 阅读 · 0 评论 -
fork后子进程保留了父进程的什么?
使用fork函数得到的子进程从父进程的继承了整个进程的地址空间包括:进程上下文进程堆栈内存信息打开的文件描述符信号控制设置进程优先级、进程组号当前工作目录根目录资源限制控制终端等子进程与父进程的区别在于:父进程设置的锁,子进程不继承(因为如果是排它锁,被继承的话,矛盾了)各自的进程ID和父进程ID不同子进程的未决告警被清除;原创 2016-04-09 20:21:55 · 4102 阅读 · 1 评论 -
gdb调试多线程
gdb使用gdb是非常强大的调试工具,在文本模式下使用。使用方法可以参考陈皓的两篇文章 用GDB调试程序(一) 用GDB调试程序(二)gdb常用命令在下表列出:命令描述backtrace(或bt)查看各级函数调用及参数finish连续运行到当前函数返回为止,然后停下来等待命令fram转载 2016-04-10 20:59:08 · 568 阅读 · 0 评论 -
使用valgrind检查内存使用问题
介绍安装使用使用未初始化内存越界使用内存内存泄漏两次释放内存使用已经释放的内存不匹配使用newdelete或newdelete介绍Valgrind是用于内存检泄漏检测、内存调试以及性能分析的工具集。这里主要介绍其用与内存相关的工具Memcheck,它可以发现大部分的内存问题,例如内存泄漏,使用未初始化内存、内存越界等问题。安装我用的时Ubun转载 2016-04-10 21:00:25 · 357 阅读 · 0 评论 -
教你怎么提高网速 最全提高网速方法
教你怎么提高网速 最全提高网速方法导语:在默认情况下Windows会限制百分之二十的网速,但是我们完全可以解除这个限制!下面为大家介绍不同系统下怎么提高网速。在默认情况下Windows会限制百分之二十的网速,但是我们完全可以解除这个限制!下面为大家介绍不同系统下怎么提高网速。一、win7怎么提高网速Win7提高网速的方法有很多,我这里给大转载 2016-04-18 22:32:03 · 10553 阅读 · 0 评论 -
关于Linux下的写时复制
关于写时复制在Linux中要启动一个新进程的方式通常是:先调用fork()函数fork出一个新的进程,然后在 新的进程中调用exec()函数来启动新的程序从而达到启动新程序的目的,比如采用下面的代码实现。intstart_prog(char*prog,char* args[]){ pid_t pid =fork(); // 创建子进程if(pid 0)return-1;if(pi原创 2016-04-18 10:58:43 · 553 阅读 · 0 评论 -
千里之行,始于足下的博客园《Linux内核设计与实现》读书笔记
当前标签: linux-kernel1、《Linux内核设计与实现》读书笔记(一)-内核简介 wang_yb 2012-08-15 23:33 阅读:1719 评论:2 2、《Linux内核设计与实现》读书笔记(二)- 内核开发的准备 wang_yb 2012-08-16 10:20 阅读:1474 评论:0 3、《Linux内核设计转载 2016-04-10 22:14:07 · 426 阅读 · 0 评论 -
进程创建
1、许多其它操作系统提供spawn产生进程的机制。而Unix采用与众不同的方式,它把上述步骤分解到两个单独的函数中去执行:fork()和exec()。首先,fork()通过拷贝当前进程创建一个子进程、子进程与父进程的唯一区别就在一进程ID。PID、PPID(父进程进程号)exec()函数负责读取可执行文件并将其载入地址空间开始运行。2原创 2016-04-10 22:13:13 · 415 阅读 · 0 评论 -
Linux中getopt()函数用法
1、getopt()2、getopt_long()下面来讲getopt_long函数,getopt_long函数包含了getopt函数的功能,并且还可以指定“长参数”(或者说长选项),与getopt函数对比,getopt_long比其多了两个参数: int getopt(int argc, char * const argv[],原创 2016-04-10 22:10:22 · 1278 阅读 · 0 评论 -
gdb调试多线程
gdb使用gdb是非常强大的调试工具,在文本模式下使用。使用方法可以参考陈皓的两篇文章 用GDB调试程序(一) 用GDB调试程序(二)gdb常用命令在下表列出:命令描述backtrace(或bt)查看各级函数调用及参数finish连续运行到当前函数返回为止,然后停下来等待命令转载 2016-04-10 22:08:45 · 435 阅读 · 0 评论 -
fork调用拷贝缓冲区
fork在创建子进程时,子进程会拷贝父进程的缓冲区。下面是一道经常见到的笔试题。输出多少个"-“?[cpp] view plain copy "font-size:14px;">#include #include int main() { int i; for( i=0;i转载 2016-04-10 21:54:44 · 337 阅读 · 0 评论 -
无锁编程:lock-free原理
定义无锁编程是指在不使用锁的情况下,在多线程环境下实现多变量的同步。即在没有线程阻塞的情况下实现同步。这样可以避免竞态、死锁等问题。原理CAS是指Compare-and-swap或Compare-and-Set CAS是一个原子操作,用于多线程环境下的同步。它比较内存中的内容和给定的值,只有当两者相同时(说明其未被修改),才会修改内存中的内容。 实现如下:int compa转载 2016-04-10 21:02:08 · 517 阅读 · 0 评论 -
Linux Namespaces机制
Linux Namespaces机制Linux Namespaces机制提供一种资源隔离方案。PID,IPC,Network等系统资源不再是全局性的,而是属于特定的Namespace。每个Namespace里面的资源对其他Namespace都是透明的。要创建新的Namespace,只需要在调用clone时指定相应的flag。Linux Namespaces机制为实现基于容器的虚拟化技术转载 2016-04-07 18:40:34 · 309 阅读 · 0 评论 -
Linux Namespace
命名空间命名空间提供了虚拟化的一种轻量级形式,使得我们可以从不同的方面来查看运行系统的全局属性。该机制类似于Solaris中的zone或 FreeBSD中的jail。对该概念做一般概述之后,我将讨论命名空间框架所提供的基础设施。1. 概念传统上,在Linux以及其他衍生的UNIX变体中,许多资源是全局管理的。例如,系统中的所有进程按照惯例是通过PID标识的,这意味着内核必须转载 2016-04-07 18:31:05 · 527 阅读 · 0 评论 -
线程安全和不可重入
线程安全问题都是由全局变量和静态变量引起的可重入函数是线程安全函数的子集可重入的要求:不使用、不返回任何非常量的全局或者静态变量,也不调用任何不可重入函数。它可以被中断,意味着它除了使用自己栈上的变量不依赖于任何环境(包括static),这样的函数就是purecode(纯代码)可重入。可以允许有多个函数的副本在同时运行,因为它们使用的是分离的栈,不会互相干扰。但是对于不原创 2016-04-07 13:39:27 · 491 阅读 · 0 评论 -
symlink函数和readlink函数,以及得到当前运行程序本身的路径
(1)symlink函数 #include int symlink(const char *oldpath, const char *newpath);(2)readlink函数 #include int readlink(const char *path, char *buf, size_t bufsize);原创 2016-04-06 10:05:46 · 726 阅读 · 0 评论 -
文件指针/句柄、文件描述符、文件路径的相互转换
原创 2016-04-06 10:07:07 · 474 阅读 · 0 评论 -
Linux下获取进程状态
(1)在/proc目录下包含了一些以数字命名的子目录,这些目录就是系统当前运行进程的proc抽象。每一个目录都以相关联的活动系统进程PID为目录名,在里面包含了一些文件,用于显示进程相关信息。每创建一个进程都会在/proc下生成一个以该进程PID为名的目录(2)在/proc下,还有一个目录/proc/self,表示当前运行进程的proc抽象,它是指当前执行进程的符号链接。打印当前运行进原创 2016-04-06 10:00:43 · 3559 阅读 · 0 评论 -
实现自己的ls命令
1234567891011121314151617181920212223242526272829303132333435原创 2016-04-06 09:58:37 · 340 阅读 · 0 评论 -
获取目录下的普通文件数目
1234567891011121314151617181920212223242526272829303132333435原创 2016-04-06 09:57:16 · 428 阅读 · 0 评论 -
proc文件系统
(1)/proc目录下的文件是系统中运行进程的映像,因此这些文件一直存储在内存中(2)/proc文件系统的设计意图在于为用户提供一组访问进程内核数据的接口(3)/proc文件系统是一个伪文件系统,它只存在内存当中(4)/proc不是普通意义上的文件系统,它既是一个到运行进程地址空间的访问接口,同时又是一个访问内核数据的接口(5)用户可以通过proc得原创 2016-04-06 09:55:19 · 381 阅读 · 0 评论 -
页面置换算法
在地址映射过程中,若在页面中发现所要访问的页面不再内存中,则产生缺页中断。当发生缺页中断时操作系统必须在内存选择一个页面将其移出内存,以便为即将调入的页面让出空间。而用来选择淘汰哪一页的规则叫做页面置换算法。常见的置换算法有:1)最佳置换算法(OPT)(理想置换算法)这是一种理想情况下的页面置换算法,但实际上是不可能实现的。该算法的基本思想是:发生缺页时,有原创 2016-04-05 20:16:52 · 556 阅读 · 0 评论 -
同步和互斥
1、同步同步是直接制约关系。多个进程合作完成一件事,需要协调他们的工作次序,比如进程A向进程B通过单缓冲区提供数据,当缓冲区为空时,进程B无法获取数据,被阻塞。当进程A将数据送入缓冲区时,通知进程B,进程B被唤醒。2、互斥互斥是间接制约关系。临界资源:同一时刻只允许一个访问者访问的资源成为临界资源,访问临界资源的那段代码成为临界区。当一个进程进入临界区使用临界资源时,另原创 2016-04-05 20:13:15 · 350 阅读 · 0 评论 -
由文件描述符得到文件的全路径
由文件描述符怎么得到该描述符对应的文件路径呢?方法:通过读取/proc文件系统下的文件得到,这个文件是: /proc/self/fd/描述符因为所有文件描述符在该目录下都是一个符号链接,链接到/dev/pts/3然后利用readlink函数读取该符号链接所链接的文件路径名即可得到文件描述符对应的文件原创 2016-04-06 10:10:20 · 1039 阅读 · 0 评论 -
硬链接的创建及删除
(1)创建硬链接 link("dest_file", "src_file");(2)unlink一个硬链接,不一定会删除文件,只有当引用计数为0时才真正删除文件 unlink("hard_file");unlink函数的真正含义:删除目录项,并减少一个链接数,如果链接数为0并且没有任何进程打开该文件,则该文件内容真正被删除,但是若有进原创 2016-04-06 10:13:56 · 1970 阅读 · 0 评论 -
umask文件权限屏蔽字
(1)当用户创建一个文件时,需要为新的文件指定一个权限字,在实际应用中,系统有时不希望用户设置所有的权限(2)例如:有些服务器程序允许客户端在服务器上创建一些文件,但是处于安全考虑,服务器系统希望该文件不应该是可执行文件(3)于是这些文件的可执行位都应该被设置为0.但遗憾的是并非所有的用户都会遵守这个约定,有些恶意的程序可能会专门设置文件的执行位(4)出于上面的原创 2016-04-06 10:16:57 · 1090 阅读 · 0 评论 -
Linux 中的零拷贝技术
Linux 中的零拷贝技术,第 2 部分技术实现本系列由两篇文章组成,介绍了当前用于 Linux 操作系统上的几种零拷贝技术,简单描述了各种零拷贝技术的实现,以及它们的特点和适用场景。第一部分主要介绍了一些零拷贝技术的相关背景知识,简要概述了 Linux 为什么需要零拷贝技术以及 Linux 中都有哪几种零拷贝技术。本文是本系列文章的第二部分,针对第一部分内容中提到的几转载 2016-04-06 18:55:00 · 607 阅读 · 0 评论 -
popen管道
popen用创建管道的方式启动一个进程并调用shell,因为管道被定义成单向,所以type参数只能定义成只读或只写。command参数是一个字符串指针,指向的是一个以null结束符结尾的字符串。这个字符串包含一个shell命令,这个命令被送到/bin/sh以-c参数执行。向这个流写入被转化为command命令的标准输入。读取一个被popen了的流相当于读取command命令的标准输出。原创 2016-04-06 18:49:58 · 331 阅读 · 0 评论 -
mmap函数和mprotect函数
include void *mmap(void *addr, //用于指定映射存储区的起始地址,通常设置为0,表示让操作系统选择该映射区的起始地址。此函数的返回地址是映射区的起始地址。 size_t len, //映射的字节数 int plot, //对映射区的保护要求 1、PROT_READ(映射区可读) 2、PROT_WRITE(映射区可写) 3、PROT_EXEC(原创 2016-04-06 18:37:10 · 2695 阅读 · 0 评论 -
Linux 伙伴堆算法
1、为了便于数据的频繁分配与回收,编程人员通常会用到空闲链表。空闲链表包含可供使用的、已分配好的数据结构块。当代码需要一个新的数据结构实例时,就从空闲链表中抓取一个,而不需要分配内存,把数据放进去。以后,当不再需要这个数据结构时,就把他放回空闲链表中,而不是释放它。从这个意义上说,空闲链表相当于高速缓存----快速存储频繁使用的对象类型。2、但是,在内核中,空闲原创 2016-04-06 16:55:26 · 2763 阅读 · 0 评论 -
fork之后父子进程的文件描述符
在fork之后处理文件描述符有两种常见的情况:(1)父进程等待子进程完成:父进程无需对其描述符做任何处理。当子进程终止后,它曾进行过读写操作的任一共享文件描述符的文件偏移量已执行了相应的更新(2)父子进程各自执行不用的程序段:父子进程各自关闭它们不需要使用的文件描述符,这样就不会干扰对方使用的文件描述符。原创 2016-04-06 18:23:10 · 1485 阅读 · 0 评论 -
关于struct类型的sizeof探究
关于struct类型的sizeof探究1、struct类型字节对齐先来看一个例子1234567struct db{ char c1; int i1; char c2; float f;};结构的第一个原创 2016-04-06 15:36:21 · 939 阅读 · 0 评论