信号量

#+SETUPFILE: ~/Dropbox/Doc/Org_Templates/level-1.org

signal 函数

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

/**
 * 使用: # ./test &
 *      # kill -SIGUSR1 pid
 *      # ./test # 然后输入 Ctrl-c
 * 
 */

void signal_handler(int signum)
{
    if (signum == SIGUSR1) {
        printf ("Receive signal SIGUSR1\n");
    } else if (signum == SIGINT) {
        /* Press down Ctrl-C in terminal */
        printf ("Receive signal SIGINT\n");
    } else {
        printf ("Receive signal %d\n", signum);
    }
}

int main(int argc, char *argv[])
{
    signal(SIGUSR1, signal_handler);
    signal(SIGINT, signal_handler);

    for ( ; ; )
        pause();

    return 0;
}

sigaction

int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);

signal 的安全版本, 用法和 signal 一样, 还可以在触发 signum 的信号处理函数 的时候设置是否阻塞其他信号(由 act决定).

以下的示例代码在使用中, 如果使用 sigemptyset 的话, 屏蔽的信号集为空, 表示在 signal_handler 过程中不阻塞任何信号, 相反, sigfillset 阻塞所有信号. 如果在 signal_handler 发生过程中, 又接收到连续的 SIGINT 信号, 那么他也只 执行一次.

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

void signal_handler(int n,struct siginfo *siginfo,void *myact)
{
    printf("signal number:%d\n",n);
    sleep(4);
}

int main(void)
{
    struct sigaction act;
    sigemptyset(&act.sa_mask);  /* 设置初始信号集为空 */
    //sigfillset(&act.sa_mask); /* 设置初始信号集为全部信号 */
    act.sa_flags=SA_SIGINFO;     /* SA_SIGINFO 表示传递附加信息到触发函数 */
    act.sa_sigaction = signal_handler;       /*设置信号处理函数*/

    if (sigaction(SIGINT,&act,NULL) < 0) {
        printf("install signal error\n");
    }

    for( ; ; ) {
        printf("wait for the signal\n");
        sleep(1);
    }
}

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦