C++使用kill发送信号终止目标进程

一 点睛

#include
#include
int kill(pid_t pid,int sig);

函数说明

kill()可以用来送参数sig指定的信号给参数pid指定的进程。

参数pid有几种情况:

  • pid>0 将信号传给进程识别码为pid的进程。

  • pid=0 将信号传给和目前进程相同进程组的所有进程

  • pid=-1 将信号广播传送给系统内所有的进程

  • pid<0 将信号传给进程组识别码为pid绝对值的所有进程

参数sig表示准备发送的信号代码,如果其值为零,则没有任何信号发出,但是系统会执行错误检查,通常会利用sig值为0来检验某个进程是否仍在执行。

返回值 执行成功则返回0,如果有错误则返回-1。此时errno可以得到错误码。

错误代码说明 

  • EINVAL 参数sig 不合法

  • ESRCH 参数pid 所指定的进程或进程组不存在

  • EPERM 权限不够无法传送信号给指定进程

二 代码

#include 
#include 
#include 
#include 
#include 
#include 
int main(void)
{
    pid_t childpid;
    int status;
    int retval;
    
    childpid = fork();  // 创建子进程
    if (-1 == childpid)  //判断是否创建失败
    {
        perror("fork()");
        exit(EXIT_FAILURE);
    }
    else if (0 == childpid)
    {
        puts("In child process");
        sleep(1000); //让子进程睡眠,以便父进程查看其行为
        exit(EXIT_SUCCESS);
    }
    else
    {
        if (0 == (waitpid(childpid, &status, WNOHANG))) //判断子进程是否已经退出
        {
            retval = kill(childpid, SIGKILL);  //发送SIGKILL给子进程,要求其停止运行
            
            if (retval)   //判断是否发生信号
            {
                puts("kill failed.");
                perror("kill");
                waitpid(childpid, &status, 0);
            }
            else
            {
                printf("%d killed\n", childpid);
            }
            
        }
    }
    
    exit(EXIT_SUCCESS);
}

三 编译运行

[root@localhost test]# g++ -o test test.cpp
[root@localhost test]# ./test
1007 killed

四 说明

代码首先创建了一个子进程,然后让子进程休眠一会儿,在父进程中发送SIGKILL信号给子进程,让其退出。

waitpid(等待子进程中断或结束)

头文件 

#include
#include

定义函数 

pid_t waitpid(pid_t pid,int * status,int options);

函数说明 

waitpid()会暂时停止目前进程的执行,直到有信号来到或子进程结束。

如果在调用wait()时子进程已经结束,则wait()会立即返回子进程结束状态值。子进程的结束状态值会由参数status返回,而子进程的进程识别码也会一块返回。

如果不在意结束状态值,则参数status可以设成NULL。

参数pid为欲等待的子进程识别码,其他数值意义如下:

  • pid<-1 等待进程组识别码为pid绝对值的任何子进程。

  • pid=-1 等待任何子进程,相当于wait()。

  • pid=0 等待进程组识别码与目前进程相同的任何子进程。

  • pid>0 等待任何子进程识别码为pid的子进程。

参数option可以为0 或下面的OR组合。

  • WNOHANG 如果没有任何已经结束的子进程则马上返回,不予以等待。

  • WUNTRACED 如果子进程进入暂停执行情况则马上返回,但结束状态不予以理会。

子进程的结束状态返回后存于status,下面有几个宏可判别结束情况:

  • WIFEXITED(status):如果子进程正常结束则为非0值。

  • WEXITSTATUS(status):取得子进程exit()返回的结束代码,一般会先用WIFEXITED 来判断是否正常结束才能使用此宏。

  • WIFSIGNALED(status):如果子进程是因为信号而结束则此宏值为真

  • WTERMSIG(status):取得子进程因信号而中止的信号代码,一般会先用WIFSIGNALED 来判断后才使用此宏。

  • WIFSTOPPED(status):如果子进程处于暂停执行情况则此宏值为真。一般只有使用WUNTRACED 时才会有此情况。

  • WSTOPSIG(status):取得引发子进程暂停的信号代码,一般会先用WIFSTOPPED 来判断后才使用此宏。

返回值 

如果执行成功则返回子进程识别码(PID),如果有错误发生则返回-1。失败原因存于errno中。

你可能感兴趣的:(C++)