- 浏览: 111446 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
leeyisoft:
我也需要相同的问题,我是在win7上面出现这样的问题的,我直接 ...
关于long node name启动失败的问题 -
hxdawxyhxdawxy:
这个不错哦,我拿了,注明你的地址
Linux proc详解 -
woshabulaji:
很详细,感谢!
Linux proc详解
前面两节已经介绍了有关信号的大部分知 识。这一节我们来了解一下这些系统调用。其中,系统调用signal是进程用来设定某个信号的处理方法,系统调用kill是用来发送信号给指定进程的。这 两个调用可以形成信号的基本操作。后两个调用pause和alarm是通过信号实现的进程暂停和定时器,调用alarm是通过信号通知进程定时器到时。所 以在这里,我们还要介绍这两个调用。
1、signal 系统调用
系统调用signal用来设定某个信号的处理方法。该调用声明的格式如下:
void (*signal(int signum, void (*handler)(int)))(int);
在使用该调用的进程中加入以下头文件:
#include <signal.h>
上述声明格式比较复杂,如果不清楚如何使用,也可以通过下面这种类型定义的格式来使用(POSIX的定义):
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
但这种格式在不同的系统中有不同的类型定义,所以要使用这种格式,最好还是参考一下联机手册。
在调用中,参数signum指出要设置处理方法的信号。第二个参数handler是一个处理函数,或者是
SIG_IGN:忽略参数signum所指的信号。
SIG_DFL:恢复参数signum所指信号的处理方法为默认值。
传递给信号处理例程的整数参数是信号值,这样可以使得一个信号处理例程处理多个信号。系统调用signal返回值是指定信号signum前一次的处理例程或者错误时返回错误代码SIG_ERR。下面来看一个简单的例子:
其中信号SIGINT由按下Ctrl-C发出,信号SIGQUIT由按下Ctrl-发出。该程序执行的结果如下:
localhost:~$ ./sig_test
process id is 463
Get a signal -SIGINT //按下Ctrl-C得到的结果
Get a signal -SIGQUIT //按下Ctrl-得到的结果
//按下Ctrl-z将进程置于后台
[1]+ Stopped ./sig_test
localhost:~$ bg
[1]+ ./sig_test &
localhost:~$ kill -HUP 463 //向进程发送SIGHUP信号
localhost:~$ Get a signal – SIGHUP
kill -9 463 //向进程发送SIGKILL信号,终止进程
localhost:~$
2、kill 系统调用
系统调用kill用来向进程发送一个信号。该调用声明的格式如下:
int kill(pid_t pid, int sig);
在使用该调用的进程中加入以下头文件:
#include <sys/types.h>
#include <signal.h>
该 系统调用可以用来向任何进程或进程组发送任何信号。如果参数pid是正数,那么该调用将信号sig发送到进程号为pid的进程。如果pid等于0,那么信 号sig将发送给当前进程所属进程组里的所有进程。如果参数pid等于-1,信号sig将发送给除了进程1和自身以外的所有进程。如果参数pid小于- 1,信号sig将发送给属于进程组-pid的所有进程。如果参数sig为0,将不发送信号。该调用执行成功时,返回值为0;错误时,返回-1,并设置相应 的错误代码errno。下面是一些可能返回的错误代码:
EINVAL:指定的信号sig无效。
ESRCH:参数pid指定的进程或进程组不存在。注意,在进程表项中存在的进程,可能是一个还没有被wait收回,但已经终止执行的僵死进程。
EPERM: 进程没有权力将这个信号发送到指定接收信号的进程。因为,一个进程被允许将信号发送到进程pid时,必须拥有root权力,或者是发出调用的进程的UID 或EUID与指定接收的进程的UID或保存用户ID(savedset-user-ID)相同。如果参数pid小于-1,即该信号发送给一个组,则该错误 表示组中有成员进程不能接收该信号。
3、pause系统调用
系统调用pause的作用是等待一个信号。该调用的声明格式如下:
int pause(void);
在使用该调用的进程中加入以下头文件:
#include <unistd.h>
该调用使得发出调用的进程进入睡眠,直到接收到一个信号为止。该调用总是返回-1,并设置错误代码为EINTR(接收到一个信号)。下面是一个简单的范例:
在这个例子中,程序开始执行,就象进入了死循环一样,这是因为进程正在等待信号,当我们按下Ctrl-C时,信号被捕捉,并且使得pause退出等待状态。
1、signal 系统调用
系统调用signal用来设定某个信号的处理方法。该调用声明的格式如下:
void (*signal(int signum, void (*handler)(int)))(int);
在使用该调用的进程中加入以下头文件:
#include <signal.h>
上述声明格式比较复杂,如果不清楚如何使用,也可以通过下面这种类型定义的格式来使用(POSIX的定义):
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
但这种格式在不同的系统中有不同的类型定义,所以要使用这种格式,最好还是参考一下联机手册。
在调用中,参数signum指出要设置处理方法的信号。第二个参数handler是一个处理函数,或者是
SIG_IGN:忽略参数signum所指的信号。
SIG_DFL:恢复参数signum所指信号的处理方法为默认值。
传递给信号处理例程的整数参数是信号值,这样可以使得一个信号处理例程处理多个信号。系统调用signal返回值是指定信号signum前一次的处理例程或者错误时返回错误代码SIG_ERR。下面来看一个简单的例子:
#include <signal.h> #include <unistd.h> #include <stdio.h> void sigroutine(int dunno) { /* 信号处理例程,其中dunno将会得到信号的值 */ switch (dunno) { case 1: printf("Get a signal -- SIGHUP "); break; case 2: printf("Get a signal -- SIGINT "); break; case 3: printf("Get a signal -- SIGQUIT "); break; } return; } int main() { printf("process id is %d ",getpid()); signal(SIGHUP, sigroutine); //* 下面设置三个信号的处理方法 signal(SIGINT, sigroutine); signal(SIGQUIT, sigroutine); for (;;) ; }
其中信号SIGINT由按下Ctrl-C发出,信号SIGQUIT由按下Ctrl-发出。该程序执行的结果如下:
localhost:~$ ./sig_test
process id is 463
Get a signal -SIGINT //按下Ctrl-C得到的结果
Get a signal -SIGQUIT //按下Ctrl-得到的结果
//按下Ctrl-z将进程置于后台
[1]+ Stopped ./sig_test
localhost:~$ bg
[1]+ ./sig_test &
localhost:~$ kill -HUP 463 //向进程发送SIGHUP信号
localhost:~$ Get a signal – SIGHUP
kill -9 463 //向进程发送SIGKILL信号,终止进程
localhost:~$
2、kill 系统调用
系统调用kill用来向进程发送一个信号。该调用声明的格式如下:
int kill(pid_t pid, int sig);
在使用该调用的进程中加入以下头文件:
#include <sys/types.h>
#include <signal.h>
该 系统调用可以用来向任何进程或进程组发送任何信号。如果参数pid是正数,那么该调用将信号sig发送到进程号为pid的进程。如果pid等于0,那么信 号sig将发送给当前进程所属进程组里的所有进程。如果参数pid等于-1,信号sig将发送给除了进程1和自身以外的所有进程。如果参数pid小于- 1,信号sig将发送给属于进程组-pid的所有进程。如果参数sig为0,将不发送信号。该调用执行成功时,返回值为0;错误时,返回-1,并设置相应 的错误代码errno。下面是一些可能返回的错误代码:
EINVAL:指定的信号sig无效。
ESRCH:参数pid指定的进程或进程组不存在。注意,在进程表项中存在的进程,可能是一个还没有被wait收回,但已经终止执行的僵死进程。
EPERM: 进程没有权力将这个信号发送到指定接收信号的进程。因为,一个进程被允许将信号发送到进程pid时,必须拥有root权力,或者是发出调用的进程的UID 或EUID与指定接收的进程的UID或保存用户ID(savedset-user-ID)相同。如果参数pid小于-1,即该信号发送给一个组,则该错误 表示组中有成员进程不能接收该信号。
3、pause系统调用
系统调用pause的作用是等待一个信号。该调用的声明格式如下:
int pause(void);
在使用该调用的进程中加入以下头文件:
#include <unistd.h>
该调用使得发出调用的进程进入睡眠,直到接收到一个信号为止。该调用总是返回-1,并设置错误代码为EINTR(接收到一个信号)。下面是一个简单的范例:
#include <unistd.h> #include <stdio.h> #include <signal.h> void sigroutine(int unused) { printf("Catch a signal SIGINT "); } int main() { signal(SIGINT, sigroutine); pause(); printf("receive a signal "); }
在这个例子中,程序开始执行,就象进入了死循环一样,这是因为进程正在等待信号,当我们按下Ctrl-C时,信号被捕捉,并且使得pause退出等待状态。
发表评论
-
Linux下cpu使用率load average的简单理解
2013-08-14 17:25 995load average一般可以通过top或者uptime观察 ... -
linux下查看进程 所占用的cpu和mem
2011-06-21 11:20 1783linux下查看进程 所占用的cpu和mem ps -o %c ... -
关闭rpc.statd服务
2010-10-21 16:07 1188转载http://blog.linsc.net/read.ph ... -
select
2010-05-31 10:41 698转自http://wenku.baidu.com/view/3 ... -
进程和线程的区别
2010-05-27 09:30 3620线程是指进程内的一个 ... -
Linux proc详解
2010-05-26 11:08 23632Linux procfs详解 1.0 proc文件系统总览 在 ... -
selinux
2010-05-26 09:16 631关闭selinux的方法 修改 /etc/selinux/co ... -
常用命令
2010-05-19 18:01 707find . -name "*.c"|xa ... -
Linux下高性能网络编程中的几个TCP/IP选项
2009-10-28 17:55 863http://blog.chinaunix.net/u3/10 ... -
Linux 的多线程编程的高效开发经验
2009-10-28 17:36 777http://www.xxlinux.com/linux/ar ... -
linux 2.4 和linux2.5以上 多线程的不同
2009-10-28 14:44 1562在Linux 2.4内核中,Linux内核中使用了一个内核线程 ... -
linux源代码包(.tar.gz)制作
2009-10-20 22:12 1197本文以“hello world”程 ... -
gdb调试多线程
2009-10-18 11:22 5681gdb提供了以下供调试多 ... -
关于SO_LINGER的使用说明
2009-09-27 18:15 4115SO_LINGER 此选项指定函数close对面向连接 ... -
vsftp配置随笔
2009-09-22 10:55 759创建ftp用户和普通用户一样 加到ftp组里面 /etc/pa ... -
Linux 信号signal处理机制 四
2009-09-03 16:40 12934、alarm和 setitimer系统调 ... -
Linux 信号signal处理机制 二
2009-09-03 16:36 1371二、信 号 机 制 ... -
Linux 信号signal处理机制 一
2009-09-03 16:35 1287信号是Linux编程中非常 ... -
linux增加路由
2009-08-27 11:13 1466route add -net 134.0.0.0 netma ... -
linux/unix常用的维护命令
2009-06-09 09:56 766find . -name "query.*" ...
相关推荐
"Linux 信号signal处理机制" 本文详细介绍了Linux信号机制的基本概念、Linux对信号机制的大致实现方法、如何使用信号,以及有关信号的几个系统调用。信号机制是进程之间相互传递消息的一种方法,信号全称为软中断...
Linux信号(Signal)处理机制是操作系统提供的一种进程间通信方式,用于进程间的异步通知。在Linux编程中,理解并掌握信号机制是非常关键的。本文将深入探讨信号的基本概念、处理方法、信号类型以及相关系统调用。 ...
在Linux系统中,信号(Signal)机制是一种关键的进程间通信方式,用于处理各种系统事件,如用户输入中断、程序错误、硬件异常等。信号在Linux内核与应用程序之间搭建了一个桥梁,允许操作系统向进程发送特定的信息,...
理解并熟练掌握Linux信号机制对于进行系统级编程至关重要。 信号是操作系统向进程发送的一种消息,它可能由内核生成,也可能由另一个进程产生。当进程接收到一个信号时,它可以选择忽略该信号,或者按照预设的行为...
### Linux信号机制与Signal详解 #### 一、信号机制的基本概念 信号是Linux操作系统中用于进程间通信的重要机制之一,其本质上是一种软中断信号。它主要用于通知进程发生了异步事件,而不涉及具体的数据传递。在...
Linux系统中的信号量处理涉及进程间通信的一种机制,允许一个进程在执行中被中断,响应另一个进程或终端发送的信号。信号提供了一种异步的软件中断方式,使得应用程序可以在接收到特定信号时,做出相应的处理。 ...
在Linux系统中,Signal机制允许进程处理各种事件,比如用户键入Ctrl+C结束程序,或者进程收到一个不可恢复的错误需要退出等。 ### Signal信号类型 Linux支持多种信号类型,包括标准信号和实时信号。标准信号是...
### Linux信号(signal)处理机制详解 #### 一、信号的基本概念 信号(signal),又被称为软中断信号,是一种用于进程间通信的重要机制。它允许进程在接收到特定的事件时能够采取相应的行动。信号的设计思想源自中断的...
下面我们将深入探讨Linux信号机制的各个方面。 1. **信号定义与类型**:Linux系统定义了一系列预定义的信号,如SIGINT(中断,由Ctrl+C产生)、SIGTERM(正常终止请求)、SIGKILL(强制终止,无法被捕获或忽略)...
### Linux信号机制详解 #### 一、信号的基本概念 在Linux操作系统中,信号(Signal)是一种重要的进程间通信(IPC, Inter-Process Communication)机制,主要用于通知进程发生了某些类型的异常事件或状态变化。...
### Linux信号机制的分析与研究 #### 一、引言 在现代操作系统中,Linux以其稳定性和灵活性成为了服务器领域的首选操作系统之一。其中,信号机制作为Linux内核中的一个重要组成部分,对于实现进程间的通信和异常...
### 第9章Linux信号与定时器 #### 一、进程间通信与信号 在Linux操作系统中,进程间通信(IPC)是实现多个进程之间数据交换和同步的重要手段。进程间通信分为即时通信和非即时通信两种类型。其中,即时通信要求...
Linux信号编程是操作系统领域的重要组成部分,特别是在开发服务器端软件或者进行系统级编程时,理解并掌握信号机制至关重要。本资源“Linux信号编程课件与实验代码.rar”提供了一个全面学习和实践Linux信号处理的...
总的来说,Linux信号机制为进程间的交互提供了灵活的方式,通过设置信号处理函数,可以定制化程序对不同事件的响应。信号处理不仅可以用于进程间的通信,也可以用于内部程序控制,如异常处理、定时器等。了解和熟练...
总结来说,Linux信号机制提供了进程间通信的基础,它不仅能够帮助我们处理异常情况,还能够用于控制进程行为和协调进程间的同步。`signalWcg.c`和`signalWcgClient.c`的示例可能展示了如何创建信号处理器、发送和...
### Linux下C语言编程——信号处理函数 #### 一、信号的基本概念与产生 在Linux系统中,**信号**是一种轻量级的进程间通信机制,用于通知接收进程某个特定事件的发生。它不仅可以由硬件异常(如除零错误)触发,也...