linux信号

Linux Core Dump

南楼画角 提交于 2020-04-04 01:06:04
转载 1. 前言: 有的程序可以通过编译, 但在运行时会出现Segment fault(段错误). 这通常都是指针错误引起的. 但这不像编译错误一样会提示到文件->行, 而是没有任何信息, 使得我们的调试变得困难起来. 2. gdb: 有一种办法是, 我们用gdb的step, 一步一步寻找. 这放在短小的代码中是可行的, 但要让你step一个上万行的代码, 我想你会从此厌恶程序员这个名字, 而把他叫做调试员. 我们还有更好的办法, 这就是core file. 3. ulimit: 如果想让系统在信号中断造成的错误时产生core文件, 我们需要在shell中按如下设置: #设置core大小为无限 ulimit -c unlimited #设置文件大小为无限 ulimit unlimited 这些需要有root权限, 在ubuntu下每次重新打开中断都需要重新输入上面的第一条命令, 来设置core大小为无限. 4. 用gdb查看core文件: 下面我们可以在发生运行时信号引起的错误时发生core dump了. 发生core dump之后, 用gdb进行查看core文件的内容, 以定位文件中引发core dump的行. gdb [exec file] [core file] 如: gdb ./test test.core 在进入gdb后,

Linux下捕捉信号

梦想的初衷 提交于 2020-03-31 00:37:39
关于 信号signal的知识铺垫 点这里 信号由三种处理方式: 忽略 执行该信号的默认处理动作 捕捉信号 如果信号的处理动作是用户自定义函数,在信号递达时就调用这个自定义函数,这称为 捕捉信号 。 进程收到一个信号后不会被立即处理,而是在恰当时机进行处理!即 内核态返回用户态之前 ! 但是由于信号处理函数的代码在用户空间,所以这增加了内核处理信号捕捉的复杂度。 内核实现信号捕捉的步骤: 用户为某信号注册一个信号处理函数sighandler。 当前正在执行主程序,这时候因为中断、异常或系统调用进入内核态。 在处理完异常要返回用户态的主程序之前,检查到有信号未处理,并发现该信号需要按照用户自定义的函数来处理。 内核决定返回用户态执行sighandler函数,而不是恢复main函数的上下文继续执行!(sighandler和main函数使用的是不同的堆栈空间,它们之间不存在调用和被调用的关系,是两个独立的控制流程) sighandler函数返回后,执行特殊的系统调用sigreturn从用户态回到内核态 检查是否还有其它信号需要递达,如果没有 则返回用户态并恢复主程序的上下文信息继续执行。 signal 给某一个进程的某一个信号(标号为signum)注册一个相应的处理函数,即对该信号的默认处理动作进行修改,修改为handler函数指向的方式; #include <signal.h>

[转帖]浅谈Linux进程模型

折月煮酒 提交于 2020-03-23 13:29:35
浅谈Linux进程模型 https://blog.lecury.cn/2019/04/04/浅谈Linux进程模型/ 写在前面 进程基础 进程概念 进程描述符 进程创建 上下文切换 init进程 进程应用 进程间通信 信号处理 后台进程与守护进程 浅谈nginx多进程模型 常用工具介绍 ps: 查看进程属性 lsof: 查看打开的文件情况 netstat: 查看网络连接情况 strace: 查看系统调用情况 进程基础 基础概念 进程是操作系统的基本概念之一,它是操作系统分配资源的基本单位,也是程序执行过程的实体。程序是代码和数据的集合,本身是一个静态的概念,而进程是程序的一次执行的实体,是一个动态的概念。 那在Linux操作系统中,是如何描述一个进程的呢? 进程描述符 为了管理进程,内核需要对每个进程的属性和所需要做的事情,进行清楚的描述,这个就是进程描述符的作用,Linux中的进程描述符由 task_struct 标识。 task_struct 的数据结构是相当复杂的,不仅包含了很进程属性的字段,而且也包括了指向其他数据结构的指针。大致结构如下: state: 描述进程状态 thread_info: 进程的基本信息 mm: mm_struct 指向内存区描述符的指针 tty: tty_struct 终端相关的描述符 fs: fs_struct 当前目录 files: files

linux下进程间通信

妖精的绣舞 提交于 2020-03-10 23:40:44
一、进程间通信方式 如果多个进程之间需要协同处理某个任务时,这时就需要进程间的同步和数据交流。常用的进程间通信(IPC,InterProcess Communication)的方法有: 1.信号(sinal) :信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。 2. 管道(Pipe) :管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系(通常是指父子进程关系)。 3.命名管道FIFO :命名管道(Named Pipe)也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。 4. 命名socket或UNIX域socket(Named Socket或Unix Domain Socket) :socket也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同进程间的进程通信。 5. 信号量(Semaphore) :信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。 6. 共享存储(Shared Memory) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制

linux ptrace系统调用探究

落爺英雄遲暮 提交于 2020-03-06 17:21:43
1. ptrace 函数简介 Ptrace是一个系统调用,它提供了一种方法来让‘父’进程可以观察和控制其它进程的执行,检查和改变其核心映像以及寄存器。 主要用来实现断点调试和系统调用跟踪。利用ptrace函数,不仅可以劫持另一个进程的调用,修改系统函数调用和改变返回值,而且可以向另一个函数注入代码,修改eip,进入自己的逻辑。这个函数广泛用于调试和信号跟踪工具。 ptrace使用场景: 由于ptrace可以跟踪运行进程并修改寄存器与内存,因此可以用于以下用途。 黑客利用该特性进行代码注入。 不退出进程,进行在线升级。 开发追踪调试工具。 函数定义 #include <sys/ptrace.h> long ptrace(enum __ptrace_request request, pid_t pid, void *addr, void *data); 函数参数解释 request:请求执行的行为,可能选择有 PTRACE_TRACEME //指示父进程跟踪某个子进程的执行。任何传给子进程的信号将导致其停止执行,同时父进程调用wait()时会得到通告。之后,子进程调用exec()时,核心会给它传送SIGTRAP信号,在新程序开始执行前,给予父进程控制的机会。pid, addr, 和 data参数被忽略。 PTRACE_PEEKTEXT, PTRACE_PEEKDATA /

linux 信号机制介绍

人走茶凉 提交于 2020-03-06 08:47:43
1、信号概述 (1) 信号是什么? 信号是在 软件层次上对中断机制的一种模拟 , 是一种异步通信方式 。 软件层次对于中断机制的模拟 说中断,一般针对的是cpu。就是说cpu正在处理一个进程,通过发送中断请求,可以让cpu先暂时停止手中的活儿,来处理更紧急的事情。而说信号是对中断的模拟是指,正在运行的程序,被发来的信号打断,取执行别的更紧急的事情。因此,信号操作的(针对的)对象是进程。 异步通信方式 异步指的是一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到达。 (2)信号用来干什么? 上面说了,信号是一种通信方式,那它的作用一定是用来通信的。信号可以用来进行进程之间的通信,因为我们知道每个进程的内存空间是独立的,那么进程之间想要通信(相互发送信息),那么就需要一种机制来实现。在linux中有好几种这样的机制,其中信号机制就是其中的一种。信号的具体作用是: 实现用户空间和用户空间进程之间的通信。(比如:进程A向进程B发送一个信号,这个信号的目的是将进程B给终止了。) 实现内核空间和用户空间之间的通信。(比如:通知用户进程发生了某个系统事件。) 2、信号的分类 信号可以分为可靠信号(实时信号)和不可靠信号(非实时)。 (1)那么什么是可靠信号,什么是不可靠信号呢? 见名便可知其义。比如进程A和进程B进行通信。 那么可靠信号指的就是,A发送了一个信号

Linux Signal

*爱你&永不变心* 提交于 2020-03-04 08:07:07
哪些情况会引发信号 1.键盘事件 ctrl +c ctrl +\ 2.非法内存 如果内存管理出错,系统就会发送一个信号进行处理 3.硬件故障 同样的,硬件出现故障系统也会产生一个信号 4.环境切换 比如说从用户态切换到其他态,状态的改变也会发送一个信号,这个信号会告知给系统 进程表的表项中有一个软中断信号域,进程对不同的信号可以同时保留,但对于同一个信号,进程并不知道在处理之前来过多少个。 内核给一个进程发送软中断信号的方法,是在进程所在的进程表项的信号域设置对应于该信号的位。这里要补充的是,如果信号发送给一个正在睡眠的进程,那么要看 该进程进入睡眠的优先级,如果进程睡眠在可被中断的优先级上,则唤醒进程;否则仅设置进程表中信号域相应的位,而不唤醒进程。这一点比较重要,因为进程检 查是否收到信号的时机是:一个进程在即将从内核态返回到用户态时;或者,在一个进程要进入或离开一个适当的低调度优先级睡眠状态时。 运行如下命令,可看到Linux支持的信号列表: $ kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15)

Linux的gdb调试命令(详细)

↘锁芯ラ 提交于 2020-03-04 06:23:22
转自: https://blog.csdn.net/gatieme/article/details/51671430 程序的调试过程主要有:单步执行,跳入函数,跳出函数,设置断点,设置观察点,查看变量。 本文将主要介绍linux下的强大调试工具是怎么完成这些工作的。 之所以要调试程序,是因为程序的运行结果和预期结果不一致,或者程序出现运行时错误。 调试的基本思想是: 分析现象 -> 假设错误原因 -> 产生新的现象去验证假设 调试器(如GDB)的目的是允许你在程序运行时进入到某个程序内部去看看该程序在做什么,或者在该程序崩溃时它在做什么。 GDB主要可以做4大类事(加上一些其他的辅助工作),以帮助用户在程序运行过程中发现bug。 * 启动您的程序,并列出可能会影响它运行的一些信息 * 使您的程序在特定条件下停止下来 * 当程序停下来的时候,检查发生了什么 * 对程序做出相应的调整,这样您就能尝试纠正一个错误并继续发现其它错误 您能使用GDB调试用C、C++、Modula-2写的程序等GNU Fortran编译器准备好过后,GDB将提供对Fortran的支持 gdb参数选项详解 gcc调试相关编译选项 GDB通过在命令行方式下输入gdb来执行。启动过后,GDB会从终端读取命令,直到您输入GDB命令quit使GDB退出。您能通过GDB命 gcc -g main.c 1

posix_kill 进程参数详解

寵の児 提交于 2020-03-02 05:31:31
http://blog.chinaunix.net/uid-24485075-id-3292539.html 定义的SIGKILL信号和SIGSTOP信号,因为它们为超级用户提供了一种使进程终止或停止的可靠方法。 Linux的信号机制基本上是继承UNIX的,但也作了些扩充。可通过输入shell命令“kill -l”获取Linux支持的信号列表。表3-1列出了Linux支持的部分信号的编号、名称、默认操作及对应的事件。Linux支持一组信号处理库函数,包括信号安装函数和信号发送函数等,它们都被定义在头文件signal.h中。 来源: oschina 链接: https://my.oschina.net/u/572288/blog/1554077

LINUX进程间通讯

自闭症网瘾萝莉.ら 提交于 2020-02-23 02:28:18
linux进程间通信概述 pid_t fork( void); 头文件:#include<unistd.h>#include<sys/types.h> (pid_t 是一个宏定义,其实质是int 被定义在#include<sys/types.h>中) 返回值: 若成功调用一次则返回两个值,子进程返回0,父进程返回子进程ID;否则,出错返回-1 pid_t 是一个类似int的宏定义 waitpid会暂时停止目前进程的执行,直到有信号来到或子进程结束。#include<sys/types.h>#include<sys/wait.h> pid_t waitpid(pid_t pid,int * status,int options); 如果在调用 waitpid()时子进程已经结束,则 waitpid()会立即返回子进程结束状态值。 子进程的结束状态值会由参数 status 返回,而子进程的进程识别码也会一起返回。如果不在意结束状态值,则参数 status 可以设成 NULL。参数 pid 为欲等待的子进程识别码, 参数options 为0为阻塞方式 WNOHANG 若pid指定的子进程没有结束,则waitpid()函数返回0,不予以等待。若结束,则返回该子进程的ID。 WUNTRACED 若子进程进入暂停状态,则马上返回,但子进程的结束状态不予以理会。WIFSTOPPED(status