信号与信号量

1.什么是信号和信号量呢?
信号与信号量

signal1.c

#include <signal.h>
#include<stdlib.h>
#include<stdio.h>
//       typedef void (*sighandler_t)(int);
//     sighandler_t signal(int signum, sighandler_t handler);
void handler(int signum)
{
        printf("signum=%d\n",signum);
        printf("Never quit!\n");

}
int main()
{
        signal(SIGINT,handler);//SIGINT对应的宏为2(如下图所示),其实快捷键就是Ctrl+C。

        while(1);
        return 0;
}
~

信号与信号量

  • 然后验证信号的工作过程,我们将signal1.c这个程序运行起来,然后再Ctrl+C看看他能不能捕捉到这个指令。
CLC@Embed_Learn:~/QYY$ ./po
^Csignum=2
Never quit!
^Csignum=2
Never quit!
^Csignum=2
Never quit!
^Csignum=2
Never quit!
^Csignum=2
Never quit!

每当我们按下快捷键,他就会出现Never quit!,验证成功,或者用kill指令,SIGINT对应的宏为2,所以我们用kill-2 xxxx这里的xxxx为进程号,功能也是一样的哦。还有可以多用一些指令来验证,然后在main函数里面用switch case识别,这里我就不演示了。

我们还可以写一个程序来运行kill命令。

#include <signal.h>
#include<stdlib.h>
#include<stdio.h>
#include <sys/types.h>

int main(int argc,char **argv)
{
        if(argc!=3)
        {
                printf("Input Error!\n");
                exit(-1);
        }
//             int kill(pid_t pid, int sig);

        int pid=atoi(argv[1]);
        int signum=atoi(argv[2]);//输入的为字符串格式,我们要转换为int形式:ASCALL TO INT =atoi
        kill(pid,signum);

        return 0;
}

结果可想而知(如果真有问题我也不好意思写出来,啊哈哈)

介绍一个函数sprintf

		 #include <stdio.h>

       int printf(const char *format, ...);
       int fprintf(FILE *stream, const char *format, ...);
       int sprintf(char *str, const char *format, ...);
       int snprintf(char *str, size_t size, const char *format, ...);

翻译过来大概是:

函数原型:int sprintf(char *buffer, const char *format, [argument]…)

参数:

(1)buffer:是char类型的指针,指向写入的字符串指针;

(2)format:格式化字符串,即在程序中想要的格式;

(3)argument:可选参数,可以为任意类型的数据;

函数返回值:buffer指向的字符串的长度;

例如:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()

{
        char cmd[128]={0};

        char *buf1="today";
        char *buf2="is";
        char *buf3="Monday!";

        sprintf(cmd,"Date :%s %s %s",buf1,buf2,buf3);
        puts(cmd);

        return 0;
}

结果为:

CLC@Embed_Learn:~/QYY$ ./a.out
Date :today is Monday!

然后结合这个函数,我们可以将之前的函数改变一下

#include <signal.h>
#include<stdlib.h>
#include<stdio.h>
#include <sys/types.h>

int main(int argc,char **argv)
{
        char cmd[128]={0};
        if(argc!=3)
        {
                printf("Input Error!\n");
                exit(-1);
        }
        //          int kill(pid_t pid, int sig);

        int pid=atoi(argv[1]);
        int signum=atoi(argv[2]);

        sprintf(cmd,"kill -%d %d",pid,signum);
        system(cmd);

        return 0;
}
~    

结果也是正确的。

上一篇:docker HEALTHCHECK


下一篇:解决mac系统docker启动mysql端口被占用