信号 09 | 函数kill和raise

1. 函数kill

#include<signal.h>
int kill(pid_t pid, int signo);  //signo:信号名

                            两个函数返回值:若成功,返回0, 若出错,返回-1

分析:

  • pid  > 0: 发送信号给指定的进程
  • pid = 0: 发送信号给调用kill函数进程属于同一个进程组的所有进程
  • pid < 0:取pid绝对值发给对应进程组。
  • pid  = -1:发送给有权限发送的系统中所有进程。

注意:

  • 进程组:每个进程都属于一个进程组,进程组是一个或多个进程的集合, 它们相互关联,共同完成一个实体任务。每个进程组都有一个进程组长,默认进程组ID与进程组长ID相同。
  • 权限保护:super用户(root)可以发送信号给任意用户,普通用户不能像系统发送信号的,kill -9(root用户的pid)是不可以的,同样,普通用户也不能向其他普通用户发送信号,终止进程。只能向自己进程发送信号,普通的用户基本规则:发送者实际或有效用户ID == 接受者实际或有效用户ID

2. 函数raise

#include<signal.h>
int raise(int signo); //signo:信号名
                            两个函数返回值:若成功,返回0, 若出错,返回-1

分析:

  • 给当前进程发送指定信号(自己给自己发)raise(signo) == kill(getpid(), signo))

3. 函数abort

#include<stdlib.h>
void abort(void);

                     此函数不返回值

分析:

  • 给自己发送异常终止信号 6) SIGABRT信号,终止并产生core文件

测试代码:

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<signal.h>

#define N 5
int main() {
    int i;
    pid_t pid, q;
    for(i = 0; i < N; i++) {
        pid = fork();
        if(pid == 0)
          break;
        if(i == 2)
          q = pid;
    }
    if(i < 5) {
        while(1) {
            printf("I'm child %d, getpid = %d\n", i, getpid());
            sleep(1);
        }
    } else {
        sleep(1);
        kill(q, SIGKILL);
        while(1);
    }
    return 0;
}

输出结果:

猜你喜欢

转载自blog.csdn.net/isunbin/article/details/83062826
今日推荐