[ KILL ]功能描述: 头文件用法:
int kill(pid_t pid, int sig);
参数: 1. pid大于零时,pid是信号欲送往的进程的标识。 sig:准备发送的信号代码,假如其值为零则没有任何信号送出,但是系统会执行错误检查,通常会利用sig值为零来检验某个进程是否仍在执行。
代码 1 #include <sys/wait.h>
2 #include <sys/types.h>
3 #include <stdio.h>
4 #include <stdlib.h>
5 #include <signal.h>
6
7 int main( void )
8 {
9 pid_t childpid;
10 int status;
11 int retval;
12
13 childpid = fork();
14 if ( -1 == childpid )
15 {
16 perror( "fork()" );
17 exit( EXIT_FAILURE );
18 }
19 else if ( 0 == childpid )
20 {
21 puts( "In child process" );
22 sleep( 100 );//让子进程睡眠,看看父进程的行为
23 exit(EXIT_SUCCESS);
24 }
25 else
26 {
27 if ( 0 == (waitpid( childpid, &status, WNOHANG )))
28 {
29 retval = kill( childpid,SIGKILL );
30
31 if ( retval )
32 {
33 puts( "kill failed." );
34 perror( "kill" );
35 waitpid( childpid, &status, 0 );
36 }
37 else
38 {
39 printf( "%d killed\n", childpid );
40 }
41
42 }
43 }
44
45 exit(EXIT_SUCCESS);
46 }
登录Linux时,系统会分配给登录用户一个终端(Session)。在这个终端运行的所有程序,包括前台进程组和后台进程组,一般都属于这个 Session。当用户退出Linux登录时,前台进程组和后台有对终端输出的进程将会收到SIGHUP信号。这个信号的默认操作为终止进程,因此前台进程组和后台有终端输出的进程就会中止。不过可以捕获这个信号,比如wget能捕获SIGHUP信号,并忽略它,这样就算退出了Linux登录,wget也能继续下载。 此外,对于与终端脱离关系的守护进程,这个信号用于通知它重新读取配置文件。 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 17) SIGCHLD 如果父进程没有处理这个信号,也没有等待(wait)子进程,子进程虽然终止,但是还会在内核进程表中占有表项,这时的子进程称为僵尸进程。这种情况我们应该避免(父进程或者忽略SIGCHILD信号,或者捕捉它,或者wait它派生的子进程,或者父进程先终止,这时子进程的终止自动由init进程来接管)。 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 在以上列出的信号中,程序不可捕获、阻塞或忽略的信号有:SIGKILL,SIGSTOP
这两个命令是用来向进程发送信号的。kill 命令需要进程号作为参数,而 killall 需要进程名称。 另外,还可以在这两个命令后附加要发送信号序号作为参数。默认情况下,它们都向相关进程发送信号 15 (TERM)。例如,如果你想要终止 PID 为 785 的进程,请输入以下命令: $ kill 785 如果您要向它发送信号 19 (STOP),请输入: $ kill -19 785 假设您知道想要终止的进程的命令名称。您可以通过该名称来终止它,而不用再使用 ps 找出该进程的进程号: $ killall -9 mozilla |
|