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;
}
~
结果也是正确的。