发送信号

kill

//fork可以返回两个值
//父进程中,fork返回子进程的ID,子进程中返回0

//pid:可能选择有以下四种
//功能:杀死进程
//参数:进程号,kill -l
// 1. pid大于零时,pid是信号欲送往的进程的标识。
// 2. pid等于零时,信号将送往所有与调用kill()的那个进程属同一个使用组的进程。
// 3. pid等于-1时,信号将送往所有调用进程有权给其发送信号的进程,除了进程1(init)。
// 4. pid小于-1时,信号将送往以-pid为组标识的进程。

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>

int main(int argc, char *argv[])
{
    pid_t pid;

    pid = fork();
    if(pid == -1)
    {
        perror("fork");
        return 0;
    }
    else if(pid == 0)
    {
        while(1)
        {
            printf("子进程等待KILL信号\n");
            sleep(1);
        }
    }
    else if(pid > 0)
    {
        int i = 0;
        for(i = 0; i < 2; i++)
        {
            printf("父进程执行中\n");
            sleep(1);
        }
        kill(pid, SIGKILL);
    }
    
    return 0;
}

执行结果:
在这里插入图片描述

alarm

//alarm所在进程时自杀
//如果没有设置过定时器,或定时器超时,返回0,否则返回剩余时间,并重新定时

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

int main(int argc, char *argv[])
{
    int second = 0;
    second = alarm(5);
    printf("second = %d\n", second);
    sleep(2);
    second = alarm(5);
    printf("second = %d\n", second);
    while(1)
    {
        printf("等待alarm定时结束\n");
        sleep(1);
    }

    return 0;
}

执行结果:
在这里插入图片描述

abort

//abort
//功能:发送SIGABRT信号,终止所在进程
//参数:无
//信号不会被阻塞

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

int main(int argc, char *argv[])
{
    printf("等待abort\n");
    sleep(2);
    abort();
    printf("abort error\n");

    return 0;
}

执行结果:
在这里插入图片描述

raise

//raise
//功能:杀死所在进程
//参数:kill -l
//返回值:成功0,失败-1

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

int main(int argc, char *argv[])
{
    printf("等待raise\n");
    sleep(2);
    raise(SIGALRM);
    printf("raise error\n");

    return 0;
}

执行结果:
在这里插入图片描述

pause

//pause
//功能:挂起进程直至捕捉到信号
//返回值,捕捉到信号返回-1

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

int main(int argc, char *argv[])
{
    printf("before pause\n");
    pause();
    printf("pause error\n");

    return 0;
}

执行结果:
在这里插入图片描述

signal

//回调函数void signal_handler(int)
//当收到信号执行回调函数signal_handler

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

//signal
void signal_handler(int signo)
{
    if(signo == SIGINT)
        printf("receive SIGINT\n");
    else if(signo == SIGQUIT)
        printf("receive SIGQUIT");
}

int main(int argc, char *argv[])
{
    printf("wait for SIGINT OR SIGQUOT\n");
    signal(SIGINT, signal_handler);
    signal(SIGQUIT, signal_handler);

    pause();
    pause();

    return 0;
}

执行结果:
在这里插入图片描述

signal返回值

//signal函数返回值
//当收到的信号事第一次注册返回NULL,否则返回上一次注册函数的地址

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

typedef void(*sighandler_t)(int);

void fun1(int signo)
{
    
}

void fun2(int signo)
{

}

int main(int argc, char *argv[])
{
    sighandler_t pre = NULL;

    pre = signal(SIGINT, fun1);
    if(pre == NULL)
    {
        printf("fun addr is null\n");
    }
    pre = signal(SIGINT, fun1);
    if(pre == fun1)
    {
        printf("fun addr is fun1\n");
    }

    pre = signal(SIGQUIT, fun2);
    if(pre == NULL)
    {
        printf("fun addr is null\n");
    }

    raise(SIGINT);
    raise(SIGINT);
    raise(SIGQUIT);

    return 0;
}

执行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值