linux信号

linux kill命令参数及用法详解

烈酒焚心 提交于 2019-11-27 21:47:20
Linux中的 kill命令用来终止指定的进程( terminate a process)的运行,是 Linux下进程管理的常用命令。通常,终止一个前台进程可以使用 Ctrl+C键,但是,对于一个后台进程就须用 kill命令来终止,我们就需要先使用 ps/pidof/pstree/top等工具获取进程 PID,然后使用 kill命令来杀掉该进程。 kill命令是通过向进程发送指定的信号来结束相应进程的。在默认情况下,采用编号为 15的 TERM信号。 TERM信号将终止所有不能捕获该信号的进程。对于那些可以捕获该信号的进程就要用编号为 9的 kill信号,强行“杀掉”该进程。 1 . 命令格式: kill[参数][进程号] 2 . 命令功能: 发送指定的信号到相应进程。不指定型号将发送SIGTERM(15)终止指定进程。如果任无法终止该程序可用“-KILL” 参数,其发送的信号为SIGKILL(9) ,将强制结束进程,使用ps命令或者jobs 命令可以查看进程号。root用户将影响用户的进程,非root用户只能影响自己的进程。 3 . 命令参数: -l 信号,若果不加信号的编号参数,则使用“-l”参数会列出全部的信号名称 -a 当处理当前进程时,不限制命令名和进程号的对应关系 -p 指定kill 命令只打印相关进程的进程号,而不发送任何信号 -s 指定发送信号 -u 指定用户 注意

linux进程通信

廉价感情. 提交于 2019-11-26 20:10:00
linux常用进程通信方式包括管道(pipe)、有名管道(FIFO)、信号(signal)、消息队列、共享内存、信号量、套接字(socket)。 管道 管道是单向、先进先出的无结构的字节流。用于父子进程之间的通信。关键系统调用如下: int pipe( int fd[2] );fd数组用于返回两个fd,分别表示通道的两端。 int main(){ int pid; int fd[2]; if(pipe(fd)<0){//父进程创建管道 perror("Fail to pipe"); exit(EXIT_FAILURE); } if((pid=fork())<0){ perror("Fail to fork"); exit(EXIT_FAILURE); }else if(pid == 0){ close(fd[1]);//表示管道的方向,fd[1]用于写 child_read_pipe(fd[0]);//子进程读取管道 }else{ close(fd[0]);//fd[0]用于读 father_write_pipe(fd[1]);//父进程写入管道 } } 有名管道 有名管道以设备文件的形式存在,可被任意知道名字的进程使用,而不止在只有亲缘关系的进程之间。 要使用有名管道,必须先建立它,并与他的一段相连,才能打开进行读写。当文件不再需要时,要显示删除。系统调用: int mknod(

用 GDB 调试Linux下的C程序

随声附和 提交于 2019-11-26 17:13:33
查看程序出现段错误的语句,可以使用where命令,好像与bt命令相同。 GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。所谓“寸有所长,尺有所短”就是这个道理。 一般来说,GDB主要帮忙你完成下面四个方面的功能: 1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。 2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式) 3、当程序被停住时,可以检查此时你的程序中所发生的事。 4、动态的改变你程序的执行环境。 从上面看来,GDB和一般的调试工具没有什么两样,基本上也是完成这些功能,不过在细节上,你会发现GDB这个调试工具的强大,大家可能比较习惯了图形化的调试工具,但有时候,命令行的调试工具却有着图形化工具所不能完成的功能。让我们一一看来。 一个调试示例 —————— 源程序:tst.c 1 #include 2 3 int func(int n) 4 { 5 int sum=0,i; 6 for(i=0; i 7 { 8 sum+=i; 9 } 10 return sum; 11 } 12 13 14 main() 15 { 16 int i; 17 long

Linux IO 概念(2)【转】

那年仲夏 提交于 2019-11-26 15:57:02
转自: https://www.cnblogs.com/qq289736032/p/9188455.html 在上一篇 IO底层的概念 中杂合了很多模糊的概念,受知识水平的限制,只是从网上抄了很多过来.从linux一切皆文件的设计哲学,介绍了文件描述符,从进程的运行内存分配,进程的切换,介绍了进程的阻塞,以及引出了阻塞IO. 在讲到阻塞IO的时,候受限于知识水平,也没有实际操作过,还是没有理解进程和IO函数的调用关系,IO又是如何操作磁盘,文件描述符又是怎样工作,进程怎么去拷贝字节流, 了解linuxIO的最终目的我是想知道JavaIO和JavaNIO在虚拟机中是如何调用的,虚拟机作为一个linux进程又是如何跟底层IO进行交互的.这些问题最终还是要去图书馆查阅书籍才能理解的更清楚, 下面继续在网络上搬迁别人家的博客 注:以下下文章整理自网络 阻塞IO 非阻塞IO 多路复用IO, 多路复用IO是为了处理多个IO问价句柄的数据操作,一个典型场景是当有很多socket服务监听不同端口以接收数据时,如果采用阻塞IO则需要多线程,每个线程和进程负责一个端口socket.但是,大量的线程和进程往往造成CPU的浪费 linuxIO多路复用技术提供一个单进程,单线程内监听多个IO读写时间的机制,其基本原理是各个IO将句柄设置为非阻塞IO,然后将各个IO句柄注册到linux提供的IO复用函数上

Linux信号signal

情到浓时终转凉″ 提交于 2019-11-25 23:17:16
如何让程序在后台运行 在之前的章节中,如果要运行程序,在命令提示行下输入程序名后回车,程序被执行,然后等待程序运行完成。在程序运行的过程中,可以用 Ctrl+c 中止它。 在实际开发中,我们需要让程序在后台运行,不受界面的影响,也不让程序员等待,例如前几章节的socket服务端程序。 如果想让程序在后台运行,有两种方法。 1、加“&”符号 如果想让程序在后台运行,执行程序的时候,命令的最后面加“&”符号。 如: ./book242 & 程序就在后台运行了。 在后台运行的程序,用Ctrl+c无法中断,并且就算终端退出了,程序仍在后台运行。 如果终端退出了,后台运行的程序将由系统托管。 在第一张图中,book249的父进程是4555,第二张图中,book249的父进程是1。 2、采用fork 另一种方法是采用fork,主程序执行fork,生成一个子进程,然后父进程退出,留下子进程继续运行,子进程将由系统托管。 示例: 上图中,突出显示的就是新增的代码。 上图中,子进程的父进程是系统进程。 3、如何让中止后台程序 问题来了,程序在后台运行了,离开了终端控制,用Ctrl+c上也无法中止,那怎么让它停下来呢?暂时用一个笨方法:杀了它。 杀程序有两个方法: 1 )killall 程序名 killall book249 2 )先用“ps -ef|grep 程序名”找到程序的进程编号,然后用