Chinaunix首页 | 论坛 | 博客
  • 博客访问: 835378
  • 博文数量: 244
  • 博客积分: 10000
  • 博客等级: 上将
  • 技术积分: 2420
  • 用 户 组: 普通用户
  • 注册时间: 2007-09-29 09:07
文章分类

全部博文(244)

文章存档

2011年(4)

2010年(3)

2009年(72)

2008年(119)

2007年(46)

我的朋友

分类: LINUX

2008-07-09 17:57:11

信号
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) SIGTERM     16) SIGSTKFLT
17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU
25) SIGXFSZ     26) SIGVTALRM   27) SIGPROF     28) SIGWINCH
29) SIGIO       30) SIGPWR      31) SIGSYS      34) SIGRTMIN
35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3  38) SIGRTMIN+4
39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12
47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14
51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10
55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7  58) SIGRTMAX-6
59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX

在glibc-2.3.5/sysdeps/unix/sysv/linux/bits/signum.h
#define    SIGHUP     1    //Hangup (POSIX)
#define    SIGINT       2    // Interrupt (ANSI). 
#define    SIGQUIT    3    // Quit (POSIX). 
#define    SIGILL       4    // Illegal instruction (ANSI). 
#define    SIGTRAP    5    // Trace trap (POSIX). 
#define    SIGABRT    6    // Abort (ANSI). 
#define    SIGIOT       6    // IOT trap (4.2 BSD). 
#define    SIGBUS      7    // BUS error (4.2 BSD). 
#define    SIGFPE       8    // Floating-point exception (ANSI). 
#define    SIGKILL      9    // Kill, unblockable (POSIX). 
#define    SIGUSR1    10    // User-defined signal 1 (POSIX). 
#define    SIGSEGV    11    // Segmentation violation (ANSI). 
#define    SIGUSR2    12    // User-defined signal 2 (POSIX). 
#define    SIGPIPE      13    // Broken pipe (POSIX). 
#define    SIGALRM    14    // Alarm clock (POSIX). 
#define    SIGTERM    15    // Termination (ANSI). 
#define    SIGSTKFLT  16    // Stack fault. 
#define    SIGCLD   SIGCHLD   // Same as SIGCHLD (System V). 
#define    SIGCHLD   17   // Child status has changed (POSIX). 
#define    SIGCONT   18    // Continue (POSIX). 
#define    SIGSTOP   19    // Stop, unblockable (POSIX). 
#define    SIGTSTP    20    // Keyboard stop (POSIX). 
#define    SIGTTIN     21   // Background read from tty (POSIX).
#define    SIGTTOU   22   //Background write to tty (POSIX)
#define    SIGURG     23   //Urgent condition on socket (4.2 BSD).
#define    SIGXCPU   24    // CPU limit exceeded (4.2 BSD). 
#define    SIGXFSZ    25    // File size limit exceeded (4.2 BSD).
#define    SIGVTALRM 26    // Virtual alarm clock (4.2 BSD). 
#define    SIGPROF     27    // Profiling alarm clock (4.2 BSD). 
#define    SIGWINCH  28    // Window size change (4.3 BSD, Sun). 
#define    SIGPOLL   SIGIO // Pollable event occurred (System V). 
#define    SIGIO      29    // I/O now possible (4.2 BSD). 
#define    SIGPWR     30    // Power failure restart (System V). 
#define    SIGSYS     31    // Bad system


vfork和fork, 以及exec函数族
vfork用于创建一个新进程,而该新进程的目的是exec一个新进程,
vfork和fork一样都创建一个子进程,但是它并不将父进程的地址空间完全复制到子进程中,因为子进程会立即调用exec,于是也就不会存放该地址空间。不过在子进程中调用exec或exit之前,他在父进程的空间中行。
    vfork和fork之间的另一个区别是: vfork保证子进程先运行,在她调用exec或exit之后父进程才可能被调度运行。如果在调用这两个函数之前子进程依赖于父进程的进一步动作,则会导致死锁。
    用fork函数创建子进程后,子进程往往要调用一种exec函数以执行另一个程序,当进程调用一种exec函数时,该进程完全由新程序代换,而新程序则从其main函数开始执行,因为调用exec并不创建新进程,所以前后的进程id 并未改变,exec只是用另一个新程序替换了当前进程的正文,数据,堆和栈段。

exec用被执行的程序完全替换调用它的程序的影像。fork创建一个新的进程就产生了一个新的PID,exec启动一个新程序,替换原有的进程,因此这个新的被exec执行的进程的PID不会改变,和调用exec函数的进程一样。
int   exec…装入和运行其它程序:
int   execl(  char *pathname,char *arg0,char *arg1,...,char *argn,NULL)
int   execle( char *pathname,char *arg0,char *arg1,...,char *argn,NULL,char *envp[])
int   execlp( char *pathname,char *arg0,char *arg1,...,NULL)
int   execlpe(char *pathname,char *arg0,char *arg1,...,NULL,char *envp[])
int   execv(  char *pathname,char *argv[])
int   execve( char *pathname,char *argv[],char *envp[])
int   execvp( char *pathname,char *argv[])
int   execvpe(char *pathname,char *argv[],char *envp[])
exec函数族装入并运行程序pathname,并将参数
arg0(arg1,arg2,argv[],envp[])传递给子程序,出错返回-1
在exec函数族中,后缀l、v、p、e添加到exec后,
所指定的函数将具有某种操作能力
有后缀  p时,函数可以利用DOS的PATH变量查找子程序文件。
假如你希望执行命令 /bin/cat /etc/passwd /etc/group,
l时,希望接收以逗号分隔的参数列表,列表以NULL指针作为结束标志
execl( "/bin/cat","/etc/passed","/etc/group",NULL);
v时,希望接收到一个以NULL结尾的字符串数组的指针
char* argv[] = {"/bin/cat","/etc/passed","/etc/group",NULL}
execv( "/bin/cat", argv );
e时,函数传递指定参数envp,允许改变子进程的环境,无后缀e时,子进程使用当前程序的环境。
envp也是一个以NULL结尾的字符串数组指针

函数pause
定义和原型如下
int pause(void)
说明: pause()会令目前的进程暂停(进入睡眠状态),直到被信号(signal)所中断。

函数kill
定义和原型如下:

int kill(pid_t pid, int sig);
使用时要引入如下的两个头文件:
#include
#include
参数说明:
pid:可能选择有以下四种:
1. pid大于零时,pid是信号欲送往的进程的标识。
2. pid等于零时,信号将送往所有与调用kill()的那个进程属同一个使用组的进程。
3. pid等于-1时,信号将送往所有调用进程有权给其发送信号的进程,除了进程1(init)。
4. pid小于-1时,信号将送往以-pid为组标识的进程。

sig:准备发送的信号代码,假如其值为零则没有任何信号送出,但是系统会执行错误检查,通常会利用sig值为零来检验某个进程是否仍在执行。
返回说明:
成功执行时,返回0。失败返回-1,errno被设为以下的某个值
EINVAL:指定的信号码无效
EPERM;没有给任何目标进程发送信号的权限
ESRCH:目标进程或进程组不存在


signal(SIGCHLD, SIG_IGN)
忽略SIGCHLD信号,这常用于并发服务器的性能的一个技巧,因为并发服务器常常fork很多子进程,子进程终结之后需要服务器进程去wait清理资源。如果将此信号的处理方式设为忽略,可让内核把僵尸子进程转交给init进程去处理,省去了大量僵尸进程占用系统资源。(Linux Only)
应用:
gsmd给猫发送at+cpin? 命令查询sim卡状态,如果需要pin码,那么gsmd会先fork一个子进程,然后exec
调用pin认证程序,认证通过以后子进程退出,现在存在问题:子退出以后仍然在内存中留下zombie processes,如果我们在gsmd中signal(SIGCHLD,SIG_IGN)就可以避免该问题。系统会自动清理僵尸进程。

参考文档
Linux Programmer's Manual SIGNAL(7)
简单的信号(signal)处理函数(linux下)
Unix下的signal编程
Unix下的signal编程二
http://hi.baidu.com/songshu5555/blog/item/9cd7951b20a4b8feaf51338b.html


阅读(931) | 评论(0) | 转发(0) |
0

上一篇:FFMPEG框架代码阅读

下一篇:游戏移植

给主人留下些什么吧!~~