[linux basic]基础--信号

线程-》信号信号,是unix和linux系统响应某些条件而产生的一个事件。接收到该信号的进程会相应地采取一些行动。raise生成表示一个信号的产生catch捕获表示接受到一个信号的产生;信号是由于某些错误条件而产生,内存段冲突,浮点处理器错误或者非法指令等。它们由shell和终端处理器生成引起中断,可以作为进程见传递消息或修改行为的一种方式,明确地由一个进程发送给另一个进程。无论什么情况,它们的编程接口都是相同的,信号可以被生成,捕获,响应,忽略。signal.h======

sigabort *进程异常终止sigalrm 超时警告sigfpe   *浮点运算错误sighup  链接挂断sigill  *非法指令sigint  终端中断sigkill  终止进程(此信号不能被不或忽略)sigpipe 向无读进程的管道写数据sigquit  中断退出sigsegv  *无效内存段访问sigterm  终止siguser1  用户定义信号siguser2  用户定义信号2注意:*表示系统对信号的响应随具体实现而定-----------》如果进程接受到这些信号中的一个,但事先没有安排不或他,进程将会立刻终止。通常系统会生产核心转储文件core,并将其放在当前目录下。该文件是进程自爱内存中的印象,他对程序的调试很有帮助。

其他信号sigchld  子进程已经停止或退出sigcont  继续执行暂停进程sigstop  停止执行(此信号不能被捕获或忽略)sigstsp  终端挂起sigttin  后台进程尝试读操作sigttou  后台进程尝试写操作

如果shell和终端驱动程序是按通常情况配置的话,在键盘上敲入中断字符(Ctrl+C)就会向前台(即当前正在执行的程序)发生sigint信号,这将引起该进程的终止,除非它事先安排了捕获这个信号。

如果想发送一个命令给进程,但该进程不是当前的前台进程,就需要使用kill命令,该命令需要一个可选的信号代码或信号名称和一个接受信号的目标进程的PID(pid一般需要ps命令查看)kill --  发送一个命令给一个进程,常用的信号包括HUP,INT,KILL,STOP,CONT,0.

程序可以使用signal库函数来处理信号,#include <signal.h>void (*signal(int sig,void (*func)(int)))(int);signal是一个带有sig和func两个参数的函数;准备捕获/忽略的信号有参数sig给出,接受到指定的信号后将要调用的函数由参数func给出,信号处理函数必须有一个int类型的参数(即接收到的信号代码)并且返回类型为void,signal函数本身也返回一个同类型的函数,即先前用来处理这个信号的函数(不是func函数);   返回的是先前对指定信号进行处理的信号处理函数的函数指针,如果未定义信号处理函数,则返回SIG_ERR,并设置errno为一个正整数值,   如果给出的是一个无效的信号,或者尝试处理的信号不可捕获/不可忽略(如SIGKILL),errno将被设置为EINVAL。也可以使用特殊值(sig_ign,sig_dfl)来代替信号处理函数;sig_ign  忽略信号sig_dfl  恢复默认信号

-----------------------信号处理例子:编写一个程序ctrlc.c,来响应用户敲入的Ctrl+c组合键,在屏幕上打印一条适当的消息而不是终止程序的运行;再次ctrl+c时,结束。
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
void ouch(int sig)
{
 printf("ouch! - I got signal %d\n",sig);
 (void) signal(SIGINT,SIG_DFL);
}

int main(){
  (void) signal(SIGINT,ouch);

  while(1){
    printf("hello world\n");
    sleep(1);
  }
}
main()的作用是捕获ctrl+c产生的SIGINT信号,没有信号产生时,它会在一个无限循环中打印字符;(void) signal(SIGINT,ouch),在捕获SIGINT信号后,会调用ouch函数进行处理;(void) signal(SIGINT,SIG_DFL),再次捕获SIGINT信号,SIG_DFL来恢复信号的默认行为;------------
				
时间: 2024-10-05 07:10:10

[linux basic]基础--信号的相关文章

[linux basic 基础]----同步

直接使用一个共享变量,来是两个线程之间进行切换是非常笨拙而且没有效率的:信号量--互斥量--这两者是相互通过对方来实现的:比如,如果想控制某一时刻只有一个线程可以访问一些共享内存,使用互斥量要自然一些: 但是控制一组相同的对下的访问时,比如同5条可用的电话线中分配1条给某个可用的线程,那么使用计数信号量:------------------------------------- 信号量,是一个特殊类型的变量,它可以被增加或减少,但对其的关键访问被保证是原子操作,及时一个多线程程序也是如比: 意味

[linux basic 基础]----线程的属性

在信号量和互斥量例子中,我们都是在程序推出之前利用pthread_join对线程进行再次同步:如果想让thread想创建它的线程返回数据我需要这么做:问题:我们有时候既不需要第二个线程向main线程返回信息,也不想让main线程等待它的结束: 就是说main线程工作的时候创建了第二个thread,第二个thread线程工作到结束,不必向main线程写新的信息:================脱离线程,detaced thread 修改线程属性或调用pthread_detach方法来解决=====

[Linux笔记]Ubuntu14.04+QT5.2配置mysql

安装qt: 官网下载qt5.2.1:qt-opensource-linux-x64-5.2.1.run 直接命令行运行:./qt-opensource-linux-x64-5.2.1.run 选择安装路径:(我选择的是/home/myname/Qt)默认为/home/yourPCname/Qt5.2.1 一步一步安装,选择组建时记得勾选“Source Components”,否则后续重新编译sql的plugin可能需要重装qt 安装mysql,编写简单测试程序: #include <QAppli

[Linux笔记]数据库mysql配置命令

# 检查MySQL服务器系统进程 ~ ps -aux|grep mysql mysql 1103 0.0 0.3 492648 51780 ? Ssl 14:04 0:21 /usr/sbin/mysqld sharon 15918 0.0 0.0 15940 968 pts/4 S+ 21:36 0:00 grep --color=auto mysql # 检查MySQL服务器占用端口 ~ netstat -nlt|grep 3306 tcp 0 0 127.0.0.1:3306 0.0.0.

[Linux笔记]配置ssh远程连接步骤

安装ssh: sudo apt-get update sudo apt-get install openssh-server 查看ssh服务器是否启动: sudo ps -e | grep ssh 查看到有ssh-aget和sshd同时都有时,配置正确. 修改ssh配置文件: sudo gedit /etc/ssh/sshd_config 找到PermitRootLogin no一行,改为PermitRootLogin yes.完成! 重启.停止ssh服务: sudo service ssh r

[Linux笔记]mysql数据库常用操作命令

#数据库操作: #建立数据库 create database data_name #删除数据库 drop database data_name #查看: show databases; #表操作: #列出表 show tables; #创建表: create table TAB_NAME( id int(10) not null auto_increment primary key, name varchar(40), pwd varchar(40) )charset=gb2312; #删除表

[WPF系列]-基础 TextBlock

AUTOMATICALLY SHOWING TOOLTIPS ON A TRIMMED TEXTBLOCK (SILVERLIGHT + WPF)

[linux服务器]安装Vesta Control Panel

参考链接http://www.5013.org/archives/819 登录 ssh [email protected][email protected]'s password: 安装过程十分傻瓜化,就像把大象装过冰箱一样简单:curl -O http://vestacp.com/pub/vst-install.sh bash vst-install.shError: this script can only be executed by root sudo bash [sudo] passw

[Linux笔记]杀死僵尸程序

A zombie is already dead, so you cannot kill it. To clean up a zombie, it must be waited on by its parent, so killing the parent should work to eliminate the zombie. (After the parent dies, the zombie will be inherited by init, which will wait on it