linux c/内核
linux c/内核
車輪の唄
atarik@163.com
展开
-
Linux文件句柄泄漏
在 Linux 平台上运行的进程都会从系统资源申请一定数量的句柄,而且系统控制了进程能够申请的最大句柄数量。用户程序如果不及时释放无用的句柄,将会引起句柄泄露,从而可能造成申请资源失败,导致系统文件句柄用光连接不能建立。本文主要介绍Linux下如何查看和修改进程打开的文件句柄数,避免这类问题的发生。句柄介绍句柄的介绍及应用句柄是在 Windows 中引入的一个概念,它是和对象一一对应的 32 位无符号整数值。句柄可以映射到唯一的对象,它是处理对象的一个接口,对于所涉及的对象,可以通过相应的句柄来操原创 2020-09-11 20:49:17 · 1891 阅读 · 0 评论 -
在Linux中设置UMASK值
umask值用于设置用户在创建文件时的默认权限,当我们在系统中创建目录或文件时,目录或文件所具有的默认权限就是由umask值决定的。对于root用户,系统默认的umask值是0022;对于普通用户,系统默认的umask值是0002。执行umask命令可以查看当前用户的umask值。[root@localhost ~]#umask0022umask值一共有4组数字,其中第1组数字用于定义特殊权限,我们一般不予考虑,与一般权限有关的是后3组数字。默认情况下,对于目录,用户所能拥有的最大权限.原创 2020-07-03 21:28:23 · 2477 阅读 · 0 评论 -
解决SHELL脚本中的export无法生效的问题
#!bin/bashexport PATH=$PATH:/usr/lib/java/jreexport PATH=$PATH:/usr/lib/java/bin---path结果发现直接运行./ path 没起到效果, 后来发现原来机制是这样: 类似于局部变量,从当前shell中运行脚本path,是先创建一个子进程shell 然后运行脚本程序,然后子进程退出,返回父进程shell,因此子shell中对环境变量的改变并不影响父进程看到的环境变量.解决办法: source ./path将代码取原创 2020-07-03 21:22:09 · 1416 阅读 · 2 评论 -
交互/非交互/登录/非登录 shell
一、交互shell 和 非交互shell1、交互shell交互式:顾名思义就是 shell 与用户存在交互,用户登录后,在终端上输入命令,shell 立即执行用户提交的命令。当用户退出后,shell 也终止了。2、非交互shell非交互式:即 shell 与用户不存在交互,而是以 shell script 的方式执行的。shell 读取存放在文件中的命令, 并且执行它们。...原创 2020-04-19 08:59:26 · 1101 阅读 · 0 评论 -
bash启动时加载配置文件过程
当用户登录系统时,会加载各种bash配置文件,还会设置或清空一系列变量,有时还会执行一些自定义的命令。这些行为都算是启动bash时的过程。另外,有些时候登录系统是可以交互的(如正常登录系统),有些时候是无交互的(如执行一个脚本),因此总的来说bash启动类型可分为交互式shell和非交互式shell。更细分一层,交互式shell还分为交互式的登录shell和交互式非登录shell,非交互的sh...原创 2020-02-22 19:09:20 · 438 阅读 · 0 评论 -
shell, exec, source执行脚本
sh方式使用$ sh script.sh执行脚本时,当前shell是父进程,生成一个子shell进程,在子shell中执行脚本。脚本执行完毕,退出子shell,回到当前shell。$ ./script.sh与$ sh script.sh等效。例子使用loop.sh脚本反复打印当前进程号。$ vi loop.sh#!/bin/shwhile [ 1 = 1 ]; do ...原创 2020-01-28 09:38:16 · 336 阅读 · 0 评论 -
零拷贝与java中的零拷贝
什么是零拷贝?零拷贝(英语: Zero-copy) 技术是指计算机执行操作时,CPU不需要先将数据从某处内存复制到另一个特定区域。这种技术通常用于通过网络传输文件时节省CPU周期和内存带宽。➢零拷贝技术可以减少数据拷贝和共享总线操作的次数,消除传输数据在存储器之间不必要的中间拷贝次数,从而有效地提高数据传输效率➢零拷贝技术减少了用户进程地址空间和内核地址空间之间因为上:下文切换而带来的开...原创 2019-12-22 09:59:56 · 311 阅读 · 0 评论 -
linux线程的新旧实现
Linux从内核2.0到内核2.4期间多线程编程使用的是LinuxThread,但使用这种方式写出的多线程程序在诸多特性上并不是跟POSIX标准兼容的. 从内核2.6开始有了新的线程实现方式NPTL(Native POSIX Thread Library)。NPTL号称解决了LinuxThread中绝大多数跟POSIX标准不兼容的特性,并提供了更好的性能,可扩展性及可维护性等等。一, Linu...原创 2019-12-21 21:33:51 · 146 阅读 · 0 评论 -
逻辑地址,线性地址和物理地址转换
一、逻辑地址转线性地址机器语言指令中出现的内存地址,都是逻辑地址,需要转换成线性地址,再经过MMU(CPU中的内存管理单元)转换成物理地址才能够被访问到我们写个最简单的hello world程序,用gcc编译,再反汇编后会看到以下指令:mov 0x80495b0, %eax这里的内存地址0x80495b0就是一个逻辑地址,必须加上隐含的DS数据段的基地址,才能构成线性地址...原创 2019-08-02 18:50:14 · 4883 阅读 · 0 评论 -
linux重定向输出
shell 错误输出重定向到标准输出./tmp/test.sh > /tmp/test.log 2>&1>和<是文件重定向符。那么1和2是什么?shell中每个进程都和三个系统文件相关联标准输入stdin标准输出stdout标准错误stderr三个系统文件的文件描述符分别为0,1和2。所以这里2>&1的意思就是将标准错误也输出到...原创 2018-12-04 10:26:31 · 1289 阅读 · 0 评论 -
进程,轻量级进程和Posix线程
OS教科书对进程和线程的区别有这样简单的概括:进程是资源分配的单位,线程是调度的单位。但是Linux内核是不区分进程和线程的,都用任务(task_struct)来表示,什么时候叫进程什么时候叫线程,需要视上下文而定。虽没有专门的线程实现,但内核用轻量级进程LWP(Light Weight Process)来代替线程。内核好比服务器,用户任务好比客户端,内核的一切都是为用户态服务的。轻量级进程就...原创 2019-08-16 15:52:12 · 439 阅读 · 2 评论 -
用户态/内核态、用户栈/内核栈
一、用户态和内核态 内核态和用户态是操作系统的两种运行级别,用于区分不同程序的不同权利。 内核态就是拥有资源多的状态,或者说访问资源多的状态,也称为特权态。相对来说,用户态就是非特权态,访问的而资源将受到限制。如果一个程序运行在特权态,该程序就可以访问计算机的任何资源,它的资源访问权限不受限制。如果一个程序运行在用户态,其资源需求将受到各种限制。如:要访问操作系统的内核数据结构...原创 2019-08-24 22:37:19 · 969 阅读 · 0 评论 -
守护进程
在Linux/UNIX系统引导的时候会开启很多服务,这些服务称为守护进程(也叫Daemon进程)。守护进程是脱离于控制终端并且在后台周期性地执行某种任务或等待处理某些事件的进程,脱离终端是为了避免进程在执行过程中的信息在任何终端上显示并且进程也不会被任何终端所产生的中断信息所终止。(被终端启动的进程,是会随着终端结束而结束的,详见:https://blog.csdn.net/asdfsadfasd...原创 2019-07-19 21:00:10 · 289 阅读 · 0 评论 -
终端进程和其启动进程之间的关系
用nohup运行命令可以使命令永久的执行下去,和用户终端没有关系,例如我们断开SSH连接都不会影响他的运行,注意了nohup没有后台运行的意思;&才是后台运行&是指在后台运行,但当用户推出(挂起)的时候,命令自动也跟着退出使用&后台运行程序: 结果会输出到终端 使用Ctrl + C发送SIGINT信号,程序免疫 关闭session发送...原创 2019-01-15 19:03:42 · 584 阅读 · 0 评论 -
同步变量
条件变量是线程的另外一种同步机制,这些同步对象为线程提供了会合的场所,理解起来就是两个(或者多个)线程需要碰头(或者说进行交互-一个线程给另外的一个或者多个线程发送消息),我们指定在条件变量这个地方发生,一个线程用于修改这个变量使其满足其它线程继续往下执行的条件,其它线程则接收条件已经发生改变的信号。条件变量同锁一起使用使得线程可以以一种无竞争的方式等待任意条件的发生。所谓无竞争就是,条件改变...原创 2019-07-11 10:34:05 · 386 阅读 · 0 评论 -
CLion中使用CMake导入第三方库的方法
set(LINK_DIR /usr/lib2/libnet-1.2-rc3/src/.libs)set(LINK_DIR2 /usr/lib2/libpcap-1.0.0)set(PRO simple_network_sniffer)#1.cmake verson,指定cmake版本cmake_minimum_required(VERSION 3.2)#2.project name,...原创 2019-02-15 09:58:26 · 9531 阅读 · 0 评论 -
静态链接和动态链接
首先大概介绍一下,编译分为3步,首先对源文件进行预处理,这个过程主要是处理一些#号定义的命令或语句(如宏、#include、预编译指令#ifdef等),生成*.i文件;然后进行编译,这个过程主要是进行词法分析、语法分析和语义分析等,生成*.s的汇编文件;最后进行汇编,这个过程比较简单,就是将对应的汇编指令翻译成机器指令,生成可重定位的二进制目标文件。以上就是编译的过程,下面主要介绍两种链接方式--...原创 2019-02-14 14:00:44 · 705 阅读 · 0 评论 -
系统调用
1. linux内核中设置了一组用于实现系统功能的子程序,称为系统调用。系统调用和普通库函数调用非常相似,只是系统调用由操作系统核心提供,运行于核心态,而普通的函数调用由函数库或用户自己提供,运行于用户态2.系统调用可以理解为内核提供给我们在用户态用的接口函数,可以认为是某种内核的库函数3.很多c函数库中的函数名与系统调用的名称一样是因为该函数本身其实就是调用的系统调用,放到c函数库就是为...原创 2019-02-16 10:31:10 · 266 阅读 · 0 评论 -
父子进程共享文件描述符
说明:1、父进程和子进程可以共享打开的文件描述符。2、父子进程共享文件描述符的条件:在fork之前打开文件。3、对于两个完全不相关的进程,文件描述符不能共享。4、父子进程文件描述符是共享的,但是关闭的时候可以分别关闭,也可以同时在公有代码中关闭 进程20029对文件的读取后的当前位置应该为data.in的k字符所在的位置,进程20030是由20029进程之后开始读取的,...原创 2019-02-18 15:20:42 · 2152 阅读 · 0 评论 -
文件读写过程
系统调用操作系统的主要功能是为管理硬件资源和为应用程序开发人员提供良好的环境,但是计算机系统的各种硬件资源是有限的,因此为了保证每一个进程都能安全的执行。处理器设有两种模式:“用户模式”与“内核模式”。一些容易发生安全问题的操作都被限制在只有内核模式下才可以执行,例如I/O操作,修改基址寄存器内容等。而连接用户模式和内核模式的接口称之为系统调用。应用程序代码运行在用户模式下,当应用程序需要...原创 2019-02-19 17:09:39 · 961 阅读 · 0 评论 -
mmap和普通文件读写对比
常规文件系统操作(调用read/fread等类函数)中,函数的调用过程: 1、进程发起读文件请求。2、内核通过查找进程文件符表,定位到内核已打开文件集上的文件信息,从而找到此文件的inode。3、inode在address_space上查找要请求的文件页是否已经缓存在页缓存中。如果存在,则直接返回这片文件页的内容。4、如果不存在,则通过inode定位到文件磁盘地址,将数据从磁盘...原创 2019-02-19 17:10:40 · 2379 阅读 · 0 评论 -
open与fopen的区别
1. 来源从来源的角度看,两者能很好的区分开,这也是两者最显而易见的区别:open是UNIX系统调用函数(包括LINUX等),返回的是文件描述符(File Descriptor),它是文件在文件描述符表里的索引。 fopen是ANSIC标准中的C语言库函数,在不同的系统中应该调用不同的内核api。返回的是一个指向文件结构的指针。 PS:从来源来看,两者是有千丝万缕的联系的,毕竟C语...原创 2019-02-19 17:45:30 · 168 阅读 · 0 评论 -
IO复用模型--epoll
参见:https://my.oschina.net/editorial-story/blog/30523081. epoll模型简介epoll是Linux多路服用IO接口select/poll的加强版,e对应的英文单词就是enhancement,中文翻译为增强,加强,提高,充实的意思。所以epoll模型会显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。epoll把用...原创 2019-02-25 12:03:39 · 569 阅读 · 0 评论 -
signal和sigaction
1:signal 函数 原型:sighandler_tsignal(int signum, sighandler_t handler) typedef void (*sighandler_t)(int); 描述:signal函数用来在进程中指定当一个信号到达进程后该做什么处理,主要的两种方式有忽略某些信号,(监听到SIGTERM/SIGINT)退出前的打扫工作。信号处理函...原创 2019-07-04 12:22:54 · 1121 阅读 · 0 评论 -
pthread系统调用
1. 创建线程pthread_create(pthread_t *, const pthread_attr_t *, void *(*)(void *), void *)参数说明pthread_t * 表示线程ID,声明方式pthread_t tid;const pthread_attr_t * 表示线程的参数,参考void *(*)(void *)表示线程开始时执行的函数,如v...原创 2019-07-10 18:34:42 · 769 阅读 · 0 评论 -
socket通信中的IO和NIO
在网络编程中对于一个网络句柄会遇到阻塞IO 和非阻塞IO 的概念, 这里对于这两种socket 先做一下说明:基本概念:阻塞IO:socket 的阻塞模式意味着必须要做完IO 操作(包括错误)才会返回。非阻塞IO:非阻塞模式下无论操作是否完成都会立刻返回,需要通过其他方式来判断具体操作是否成功。IO模式设置:对于一个socket 是阻塞模式还是非阻塞模式有两种方式来处理:方法1、...原创 2019-07-05 14:04:12 · 328 阅读 · 0 评论 -
Linux下getopt()函数
int getopt(int argc,char * const argv[ ],const char * optstring);前两个参数大家不会陌生,没错,就是老大main函数的两个参数!老大传进来的参数自然要有人接着!第三个参数是个字符串,看名字,我们可以叫他选项字符串(后面会说明)返回值为int类型,我们都知道char类型是可以转换成int类型的,每个字符都有他所对应的整型值,...原创 2019-02-15 16:52:45 · 148 阅读 · 0 评论