linux系统编程
老王不让用
芝兰生于幽谷,不以无人而不芳; 君子修身立德,不为穷困而改节
展开
-
kqueue用法简介
1.什么是kqueue和IO复用kueue是在UNIX上比较高效的IO复用技术。所谓的IO复用,就是同时等待多个文件描述符就绪,以系统调用的形式提供。如果所有文件描述符都没有就绪的话,该系统调用阻塞,否则调用返回,允许用户进行后续的操作。常见的IO复用技术有select, poll, epoll以及kqueue等等。其中epoll为Linux独占,而kqueue则在许多UNIX系统上存在,包括OS X(好吧,现在叫macOS了。。)2. 使用概览kueue在设计上是非常简洁的,在易用性上可能转载 2021-11-11 15:15:02 · 1527 阅读 · 0 评论 -
什么是.so文件
so文件是Linux下的程序函数库,即编译好的可以供其他程序使用的代码和数据linux下何谓.so文件:用过windows的同学应该都知道 .dll文件吧, 这二者有什么共通之处呢,其实 .so文件就跟.dll文件差不多 一般来说.so文件就是常说的动态链接库, 都是C或C++编译出来的。与Java比较就是:它通常是用的Class文件(字节码) Linux下的.so文件时不能直接运行的,一般来讲,.so文件称为共享库那么.so文件是怎么用的呢?for example:(1) 动态库的编译.转载 2021-02-09 14:26:32 · 71440 阅读 · 1 评论 -
linux 进程(线程)D 状态构造
代码如下:#include <stdio.h>#include <sys/types.h>#include <unistd.h>int main() { if (!vfork()){ while(1){ sleep(1); } } return 0;} 实验结果:[root@localhost some_func]# gcc task_d_status.c -o task_d_status[root@localho原创 2021-01-25 14:36:03 · 2285 阅读 · 0 评论 -
linux内核信号的处理过程
目录1、什么是信号2、进程对信号的响应操作3、注册信号处理函数4、Linux下信号处理机制4.1、进程如何发现和接受信号?4.2、信号检测和响应时机4.3、进入信号处理函数4.4、信号处理函数执行完后怎么办?1、什么是信号信号本质上是在软件层次上对中断机制的一种模拟,其主要有以下几种来源:程序错误:除零,非法内存访问…外部信号:终端Ctrl-C产生SGINT信号,定时器到期产生SIGALRM…显式请求:kill函数允许进程发送任何信号给其他进程或进程组。转载 2020-09-10 14:14:20 · 2003 阅读 · 2 评论 -
一次用户态进程死循环案例的分析
1、问题现象业务进程(用户态多线程程序)挂死,操作系统反应迟钝,系统日志没有任何异常。从进程的内核态堆栈看,看似所有线程都卡在了内核态的如下堆栈流程中:[root@vmc116 ~]# cat /proc/27007/task/11825/stack[] retint_careful+0x14/0x32[] 0xffffffffffffffff2、问题分析2.1、内核堆栈分析从内核堆栈看,所有进程都阻塞在 retint_careful上,这个是中断返回过程中的流程,代码(汇编)如下:转载 2020-09-11 19:15:42 · 757 阅读 · 0 评论 -
Linux 下系统调用过程以及方法
目录1、系统调用过程2、系统调用三种方法2.1、通过 glibc 提供的库函数2.2、使用 syscall 直接调用2.3、通过 int 指令陷入系统调用(System Call)是操作系统为在用户态运行的进程与硬件设备(如CPU、磁盘、打印机等)进行交互提供的一组接口。当用户进程需要发生系统调用时,CPU 通过软中断切换到内核态开始执行内核系统调用函数。1、系统调用过程以 Linux 0.11 为例简述调用过程,没有查证现代操作系统是否有所变化,不过基本思路应该差不多。如下转载 2020-09-09 18:44:30 · 3560 阅读 · 0 评论 -
linux系统:ptrace系统调用浅析
目录1. ptrace 介绍2.ptrace 的函数详解3、读取线程寄存器值1. ptrace 介绍 Ptrace 提供了一种父进程可以控制子进程运行,并可以检查和改变它的核心image。它主要用于实现断点调试。一个被跟踪的进程运行中,直到发生一个信号。则进程被中止,并且通知其父进程。在进程中止的状态下,进程的内存空间可以被读写。父进程还可以使子进程继续执行,并选择是否是否忽略引起中止的信号。当然这里的被追踪的进程不仅仅是仅限于子进程也可以是任意的其它的进程或者线程。2.p...原创 2020-09-08 18:33:31 · 784 阅读 · 0 评论 -
linux系统:信号重定向,抓取线程堆栈
需求:当 linux 系统下的进程发生段错误、异常中止时,内核会抛出对应的信号量,通常这些信号量默认操作都是中止进程,生成core 文件以便系统工程师进行故障分析,但是在一些磁盘空间的较小的场景,如一些嵌入式设备,当程序较大时,不能生成 core 文件,此时需要我们对这些信号量进行重定向,即自定义处理,通常的操作是抓取当前执行线程的堆栈。代码如下://gcc -o test_process test_process.c -rdynamic -ldl -lpthread#ifndef _GNU_原创 2020-09-09 21:41:51 · 926 阅读 · 1 评论 -
再次认识 errno之线程安全
1、errno的由来在C编程中,errno是个不可缺少的变量,特别是在网络编程中。如果你没有用过errno,那只能说明你的程序不够健壮。当然,如果你是WIN32平台的GetLastError(),效果也是一样的。为什么会使用errno呢?个人认为,这是系统库设计中的一个无奈之举,他更多的是个技巧,而不是架构上的需要。我们观察下函数结构,可以发现,函数的参数返回值只有一个,这个返回值一般可以携带错误信息,比如负数表示错误,而正数表述正确的返回值,比如recv函数。但是对于一些返回指针的函数,如:char转载 2020-08-31 19:25:19 · 1815 阅读 · 0 评论 -
read/fread write/fwrite 的区别
read就是通过read来实现的,fread是C语言的库,而read是系统调用。差别在read每次读的数据是调用者要求的大小,比如调用者要求读取10个字节数据,read就会从内核缓冲区(操作系统开辟的一段空间用来存储磁盘上的数据)读10个字节数据到数组中,所以每次调用read会涉及到用户态与內核态之间的切换从而损耗一定的性能。而fread不一样,为了加快读的速度,fread每次都会从内核缓冲区读比要求更多的数据,然后放到应用进程缓冲区(首地址存在FILE结构体中),这样下次再读数据只需要到应用进程缓冲区中转载 2020-08-22 15:18:39 · 1478 阅读 · 0 评论 -
Linux 编程之孤儿进程和僵尸进程
目录1、孤儿进程2、僵尸进程1、孤儿进程定义:没有父进程的进程,unix环境中,当父进程比子进程先退出,子进程变为孤儿进程,linux环境中的1号进程 "/sbin/init" 接管系统中的所有的孤儿进程,因此此时子进程的父进程变为1号进程,代码如下:... if((pid = fork()) < 0) { printf("fork error\n"); } else if(pid == 0) { printf("child:self_pid=%d,parent原创 2020-08-02 15:12:12 · 319 阅读 · 0 评论 -
Linux 编程之共享内存
1、共享内存定义 共享内存就是允许两个或多个进程共享同一片内存,即多个进程访问的是同一片物理内存。因此,当一个进程改变了这块地址中的内容的时候,其它进程都会察觉到这个更改。相比较socket、管道等进程通信方式,共享内存无疑是最快的一种。但是共享内存中没有任何的同步与互斥机制,这一点需要额外实现,无非也就是加一把锁而已。 共享内存的生命周期随内核。即所有访问共享内存区域对象的进程都已经正常结束,共享内存区域对象仍然在内核中存在(除非显式删除共享内存区域对象),在内核重新引导之...原创 2020-08-02 15:08:03 · 485 阅读 · 0 评论