信号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) |