【Linux】基础:进程信号
【Linux】基础:进程信号
摘要:本文将会从生活实际出发,由此掌握进程信号的学习过程,分别为信号的产生、信号的传输、信号的保存和信号的处理,最后再补充学习信号后方便理解的其他概念。
文章目录
- 【Linux】基础:进程信号
- 一、概述
- 1.1 信号理解
- 1.2 预备知识
- 1.2.1 系统定义的信号列表
- 1.2.2 signal系统调用
- 1.2.3 信号相关常见概念
- 二、信号的产生
- 2.1 通过终端按键产生信号
- 2.2 进程发生异常产生信号
- 2.2.1 程序崩溃的本质
- 2.2.2 程序崩溃信号发送的过程
- 2.2.3 补充:获取崩溃的原因
- 2.3 通过系统调用产生信号
- 2.3.1 kill
- 2.3.2 raise
- 2.3.3 abort
- 2.4 通过软件条件产生信号
- 三、信号的传输
- 四、信号的保存
- 4.1 概述
- 4.2 系统调用
- 4.2.1 sigset_t
- 4.2.2 信号集操作函数
- 4.2.3 sigprocmask
- 4.2.4 sigpending
- 五、信号的处理方式
- 5.1 信号处理时机
- 5.2 信号处理方式
- 5.3 sigaction
- 六、总结
- 七、知识补充
- 7.1 可重入函数
- 7.2 volatile
- 7.3 sigchld
一、概述
1.1 信号理解
信号是进程之间事件异步通知的一种方式,属于软中断。对于这句话的理解是较为抽象的,为此可以从实际生活出发了解生活中的概念,从而获取学习进程信号的方法。
比如在实际生活中的烽火戏诸侯、谈虎色变、闻鸡起舞等,对于这些信号来说,首先并非是天生就知道的 ,而是需要被教育,需要了解信号的产生与发送过程。其次对于这些信号的处理动作,也是需要后天教育,而对于信号处理发生的时机,也是需要在特定的场景,合适的时候才可以触发,比如望梅才会止渴。可是在生活中,信号不一定被立即处理,信号随时都可能产生(异步),此时可能有更复杂的事情选哟处理,当时机不合适时,还需要在我们大脑中保存下信号。
为此推导出进程间的通信内容,需要掌握的是进程间信号的产生,信号是如何发送给进程的,进程是如何被识别的,信号需要在哪些适合的时候去执行哪些对应的信号处理动作。
而这些信号的内容,本质上是属于进程的数据,对于信号的发送,则是先PCB中写入信号数据,而PCB是一个内核数据结构,为此信号的本质是底层操作系统发送的数据。
1.2 预备知识
1.2.1 系统定义的信号列表
通过指令kill -l
可以查看系统定义的信号列表,示例如下:
[root@VM-12-7-centos Blog_Signal]# kill -l1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
- 每个信号都有一个编号和一个宏定义名称,这些宏定义可以在signal.h中找到,例如其中有定 义
#define SIGINT 2
- 编号34以上的是实时信号,编号34以下的是普通信号,本章只讨论编号34以下的信号,不讨论实时信号。
- 普通信号的产生条件,默认动作等信息在
man 7 signal
中有详细说明- 在以往常用的信号有
Ctrl + c
为2号信号,Ctrl + /
为3号信号,Ctrl + z
为19号信号。
1.2.2 signal系统调用
作用:进程用该系统调用设定某个信号的处理方法
头文件:
#include <signal.h>
定义:
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
void (*signal(int signum, void (*handler)(int)))(int);
参数:
signum:表示需要设定的某个信号的序号
handler:信号处理动作,该函数的为注册函数,注册函数时不调用该函数,只有当信号到来时,这个函数才会调用。除自定义信号处理动作,还可以是以下是相关宏定义:
SIG_IGN:忽略参数signum所指的信号。
SIG_DFL:恢复参数signum所指信号的处理方法为默认值。
返回值:返回值为sighandler_t
,实际上为 void (*sighandler_t)(int)
,该数据类型为返回值为void
,参数为int
的函数指针。
示例:通过自定义2号信号,进行自定义信号处理,当通过键盘将二号信号发送后,会打印信号发送的信号和进程的pid。
#include <stdio.h>
#include <signal.h>
#include <unistd.h>void handler(int signo){printf("get a signal: NO %d,pid: %d\n",signo,getpid());
}int main(){signal(2,handler);while(1){printf("hello world,pid :%d\n",getpid*());sleep(1);}
}
[root@VM-12-7-centos Blog_Signal]# ./test_signal
hello world,pid :3365344
hello world,pid :3365344
^Cget a signal: NO 2,pid: 3365344
hello world,pid :3365344
^Cget a signal: NO 2,pid: 3365344
hello world,pid :3365344
补充:第9号信号是不可以被捕获的,示例如下:
#include <stdio.h>
#include <signal.h>
#include <unistd.h>void handler(int signo){printf("get a signal: NO.%d\n",signo);
}int main(){int sig = 1;for(;sig <= 31; sig++){signal(sig,handler);}while(1){printf("hello world,pid :%d\n",getpid());sleep(1);}
}
[root@VM-12-7-centos Blog_Signal]# ./test_signal
hello world,pid :3369302
^Cget a signal: NO.2
......
hello world,pid :3369302
^_hello world,pid :3369302
......
hello world,pid :3369302
^Zget a signal: NO.20
hello world,pid :3369302
......
Killed
[root@VM-12-7-centos Blog_Signal]# kill -9 3369302
1.2.3 信号相关常见概念
- 信号递达(Delivery):实际执行信号处理的动作,包括默认、忽略和自定义捕捉
- 信号未决(Pending):信号从产生到递达之间的状态,本质是这个信号被暂存到进程PCB的信号位图中
- 阻塞(Block):进程可以阻塞某个信号,本质是操作系统允许进程展示评比指定的信号,而且该型号依旧是未决的,且信号是不会被递达,直到解除阻塞方可递达。
递达的忽略和阻塞的区别:忽略是递达的一种方式,阻塞是没有被递达,是一种独立状态。
二、信号的产生
信号的产生主要有四种方式,分别为:
- 通过终端按键产生信号
- 由于进程发生异常而产生信号
- 通过系统调用产生信号
- 通过软件条件产生信号
信号产生的本质:操作系统向目标进程发送信号
2.1 通过终端按键产生信号
在以往运行可执行程序时,常会在以键盘来发送信号,常用的信号有Ctrl + c
为2号信号,Ctrl + /
为3号信号,Ctrl + z
为19号信号。其中,SIGINT
的默认处理动作是终止进程,SIGQUIT
的默认处理动作是终止进程,简单的示例如下:
[root@VM-12-7-centos Blog_Signal]# ./test_signal
hello world,pid :3374471
hello world,pid :3374471
^Cget a signal: NO.2
hello world,pid :3374471
^Zget a signal: NO.20
2.2 进程发生异常产生信号
2.2.1 程序崩溃的本质
当进程发生异常时,进程会发生崩溃,发生崩溃的本质原因就是获得了信号,然后进程执行信号的默认行为。通过以下示例,先空指针NULL
中写入数据,发生程序异常,并获取对应信号。示例如下:
#include <stdio.h>
#include <unistd.h>int main(){int sig = 1;while(1){int *p = NULL;*p = 100;printf("hello world\n");sleep(1);}
}
[root@VM-12-7-centos Blog_Signal]# ./test_signal
Segmentation fault (core dumped)
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>void handler(int signo){printf("get a signal: NO.%d\n",signo);exit(1);
}int main(){int sig = 1;for(;sig <= 31; sig++){signal(sig,handler);}while(1){int *p = NULL;*p = 100;printf("hello world\n");sleep(1);}
}
[root@VM-12-7-centos Blog_Signal]# ./test_signal
get a signal: NO.11
2.2.2 程序崩溃信号发送的过程
对于软件上的异常错误来说,一般会体现在硬件或者其他软件上。因此当程序发生异常时,CPU或者内存等硬件将会将错误体现出来,而操作系统是硬件的管理者,对于硬件的健康进行负责的是操作系统,因此操作系统将会发送信号给进程,让程序崩溃。示意图如下:
2.2.3 补充:获取崩溃的原因
进程等待
当程序崩溃时,需要获取程序崩溃的原因,崩溃时收到的时哪一个信号,在哪一行程序代码发生了异常。在进程控制一文中的进程等待内容中,介绍过waitpid()
和status
进行记录。在Linux中,当一个进程正常退出时,他的退出码和退出信号都会被设置。当一个进程异常退出时,进程的退出信号会被设置,表明当前进程退出的原因,在必要时,操作系统可以设置退出信息中的core dump的标志位,并在进程在内存中的数据转储到磁盘中,方便后期进行调试。
设置core-dump
通过指令ulimit -a
可以查看core dump的设置情况,通过ulimit -c
可以设置core dump
,其中core file size
即生成的core文件字符的大小。示例如下:
[root@VM-12-7-centos Blog_Signal]# ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
......
[root@VM-12-7-centos Blog_Signal]# ulimit -c 10240
[root@VM-12-7-centos Blog_Signal]# ulimit -a
core file size (blocks, -c) 10240
......
再设置core dump标志位后,程序崩溃后会提示(core dump)字符,生成对应的core-file文件
并可以使用gdb进行事后调试,示例如下:
int main(){while(1){int a = 10;a /= 0;printf("hello world\n");sleep(1);}
}
[root@VM-12-7-centos Blog_Signal]# ls core*
core-test_signal-3443746
验证core dump设置
而对于进程等待的输出型参数status
,在进程异常退出时,core dump
将会设置为1,否则将会设置为0,以下通过实验进行证明:
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <sys/types.h>int main(){if(fork() == 0){while(1){printf("I am a child!\n");int a = 1;a /= 0;}}int status = 0;waitpid(-1,&status,0);printf("exit code:%d\nexit signal:%d\ncore dump flag:%d\n",(status>>8)&0xFF,status&0x7F,(status>>7)&1);
}
[root@VM-12-7-centos Blog_Signal]# ./test_signal
I am a child!
exit code:0
exit signal:8
core dump flag:1
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <sys/types.h>int main(){if(fork() == 0){printf("I am a child!\n");int a = 1;exit(1);}int status = 0;waitpid(-1,&status,0);printf("exit code:%d\nexit signal:%d\ncore dump flag:%d\n",(status>>8)&0xFF,status&0x7F,(status>>7)&1);
}
[root@VM-12-7-centos Blog_Signal]# ./test_signal
I am a child!
exit code:1
exit signal:0
core dump flag:0
2.3 通过系统调用产生信号
在此主要介绍三种方式来完成系统调用的信号产生,分别为:
- 通过kill系统调用发送相应信号
- 通过raise完成信号发送
- 通过abort完成信号发送给
2.3.1 kill
头文件:
#include <sys/types.h>
#include <signal.h>
定义:int kill(pid_t pid, int sig);
作用:给进程发送信号
参数:
- pid:进程描述符,当pid>0,将此信号发送给进程ID为pid的进程;pid=0,将此信号发送给进程组ID和该进程相同的进程;pid<0,将此信号发送给进程组内进程ID为pid的进程;pid==-1,将此信号发送给系统所有的进程。
- sig:表示要发送的信号的编号,假如其值为0则没有任何信号送出,但是系统会执行错误检查,通常会利用sig值为0来检验某个进程是否仍在执行。
返回值:成功执行时,返回0;失败返回-1。errno被设为以下的某个值EINVAL:指定的信号码无效(参数sig不合法);EPERM:权限不够无法传送信号给指定进程;ESRCH:参数pid所指定进程或进程组不存在。
说明:可以通过kill -l
指令进行查看信号种类
[root@VM-12-7-centos Blog_Signal]# kill -l1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
示例:通过命令行参数获取信号和进程控制块pid,通过kill系统调用完成信号传递,示例如下:
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <sys/types.h>static void Usage(const char* proc){printf("Usage:\n\t %s signo Pid\n",proc);
}
int main(int argc,char *argv[]){if(argc != 3){Usage(argv[0]);return 1;}int signo = atoi(argv[1]);int Pid = atoi(argv[2]);printf("signo: %d ---> Pid :%d\n",signo,Pid);kill(Pid, signo);return 0;
}
[root@VM-12-7-centos Blog_Signal]# ./test_kill
hello world ---> PID = 3428088
Killed
[root@VM-12-7-centos Blog_Signal]# ./test_signal 9 3428088
signo: 9 ---> Pid :3428088
2.3.2 raise
头文件:#include <signal.h>
定义:int raise(int sig);
作用:给当前进程发送指定信号(自己给自己发信号),raise(signo)
相当于kill(getpid(),signo)
参数:表示要发送的信号的编号
返回值:成功返回0;失败返回非0值
示例:向自身进程发送3号信号
#include <stdio.h>
#include <signal.h>
#include <unistd.h>int main(){while(1){printf("hello world\n");sleep(5);raise(3);}
}
[root@VM-12-7-centos Blog_Signal]# ./test_signal
hello world
Quit (core dumped)
2.3.3 abort
头文件:#include <stdlib.h>
定义:void abort(void);
作用:使当前进程接收到信号而异常终止
返回值:就像exit函数一样,abort函数总是会成功的,所以没有返回值
示例:调用abort函数终止自身进程
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>void handler(int signo){printf("get a signal: NO.%d\n",signo);exit(1);
}int main(){int sig = 1;for(;sig <= 31; sig++){signal(sig,handler);}int cnt = 3;while(1){printf("hello world:Pid ---> %d\n",getpid());if(cnt == 0){abort();}cnt--;sleep(1);}
}
[root@VM-12-7-centos Blog_Signal]# ./test_signal
hello world:Pid ---> 3431841
hello world:Pid ---> 3431841
hello world:Pid ---> 3431841
hello world:Pid ---> 3431841
get a signal: NO.6
2.4 通过软件条件产生信号
通过某种软件(操作系统),来触发信号的发送,如系统层面设置定时器,或者某种操作而导致条件不就绪等这样的场景将会触发信号的发送。最为常见的例子是进程间的通信,当读端关闭了fd时,写端一直在写,最终会收到13号信号(sigpipe),就是一种典型的软件条件触发信号的产生。
在此介绍系统调用alarm
来完成该方法的信号产生,具体内容如下:
alarm
头文件:#include <unistd.h>
定义:unsigned int alarm(unsigned int seconds);
作用:设置一个定时器来传输信号,信号为14号信号
参数:设置的秒数
返回值:0或者是以前设定的闹钟时间还余下的秒数
示例:完成信号捕获操作,并且对信号的返回值不断地获取,通过alarm
的两次调用提前终止预设秒数。
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>void handler(int signo){printf("get a signal: NO.%d\n",signo);exit(1);
}
int main(){signal(SIGALRM,handler);int ret = alarm(10);while(1){printf("hello world:PID = %d,ret = %d\n",getpid(),ret);sleep(2);int res = alarm(1);printf("res = %d\n",res);}
}
[root@VM-12-7-centos Blog_Signal]# ./test_signal
hello world:PID = 3435462,ret = 0
res = 8
hello world:PID = 3435462,ret = 0
get a signal: NO.14
三、信号的传输
了解信号产生的方式后,那么操作系统是如何给进程发送信号的呢,从进程的管理和组织方式而言,就是操作系统发送信号给进程数据控制块。因此,对于进程控制块而言,除了相应的进程属性外,还会有记录保存是否收到信号的对应数据结构。而在以往的观察可以发现,通过kill -l
指令查看信号,信号是有编号的,对于普通信号而言,正是32位信号。可以推测,其实对应的数据结构又是采用了位图结构,所谓比特位的位置标示第几个信号,比特位的内容,而位置的内容表示是否收到信号。
因此对于操作系统发送信号给进程的本质就是操作系统向指定的信号位图写入比特位,即完成信号的发送。
四、信号的保存
4.1 概述
在了解本段内容前需要再次复习1.2.3的信号相关常见概念,了解各个信号的阻塞状态、处理动作和递达状态。
信号在内核中是通过三张表完成保存的,这三张表分别为:pending表、block表和handler表,以下是具体介绍及其图解:
- pending表:位图数据结构,表示确认进程是否收到信号。通过无符号32位整数定义,比特位的位置表示哪一个信号,比特位的内容,表示是否收到信号。对应了信号的未决状态。
- handler表:函数指针数组为数据结构,函数指针传参有三种形式,分别为宏定义
SIG_DFL
表示默认定义的、宏定义SIG_IGN
表示忽略,函数void sighandler(int signo)
表示自定义捕捉,系统调用signal就是修改了该表的内容,对应了常见概念中的信号的递达操作。- block表:也称信号屏蔽字,为位图数据结构,同样采用32位无符号整数定义,比特位的位置表示信号的编号,比特位的内容代表信号是否被阻塞。
进程内置了“识别”信号的方式,对于该三个表的查看进程的信号是通过**横向查看的,首先查看信号是否被block,如果block表置1,则不会查看是否收到信号。如果block未被阻塞,将会查看信号是否收到,如果收到将会在handler表中调用相应的递达方法。**在此使用伪代码进行说明,代码如下:
int isHandler(int signo){if(block & signo){//信号是否被阻塞//不会查看信号}else{//如果信号未被阻塞if(signo & pending){ // 该型号未被阻塞且收到信号handler_array[signo](signo);return 0;}}return 1;
}
4.2 系统调用
4.2.1 sigset_t
对于系统调用而言,不单单只有接口才算是系统调用,操作系统给予用户提供的不仅有借口,还有各种数据类型,配合系统调用来完成。在4.1介绍的pending表和block表中,可以发现每个信号只有一个bit的表决标志,不记录该信号的发生次数,因此可以采用位图的数据结构,一般情况下,是使用32位无符号整数来表明的,当对于内核来说,不可以直接给予用户使用无符号数来对此表示,为此内核提供了内核数据结构sigset_t
,这个数据集称为信号集。
sigset_t
类型可以表示每个信号的“有效”或“无效”状态,在阻塞信号集中“有效”和“无效”的含义是该信号是否被阻塞,而在未决信号集中“有效”和“无效”的含义是该信号是否处于未决状态。
4.2.2 信号集操作函数
虽然sigset_t
是一个位图结构,但是不同操作系统实现是不一样的,这个类型内部如何存储这些数据则依赖于系统实现,从使用者的角度是不必关心的,使用者只能调用信号集操作函数来操作sigset_ t
变量,而不应该对它的内部数据做任何解释。信号集操作函数如下:
#include <signal.h>
int sigemptyset(sigset_t *set);
int sigfillset(sigset_t *set);
int sigaddset (sigset_t *set, int signo);
int sigdelset(sigset_t *set, int signo);
int sigismember(const sigset_t *set, int signo);
- sigemptyset:初始化set所指向的信号集,使其中所有信号的对应bit清零,表示该信号集不包含任何有效信号
- sigfillset:初始化set所指向的信号集,使其中所有信号的对应bit置位,表示 该信号集的有效信号包括系统支持的所有信号
- sigaddset:初始化sigset_t变量之后调用sigaddset和sigdelset在该信号集中添加某种有效信
- sigdelset:初始化sigset_t变量之后调用sigaddset和sigdelset在该信号集中删除某种有效信
- sigismember:是一个布尔函数,用于判断一个信号集的有效信息中是否包含某种信号,不包含返回0,出错返回-1
- 返回值:前四个函数成功返回0,出现错误返回-1
4.2.3 sigprocmask
头文件: #include <signal.h>
定义:int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
作用:调用函数sigprocmask可以读取或更改进程的信号屏蔽字(阻塞信号集)
参数:
how:表示用于指定信号修改的方式,主要有三种可选值:
可选值 作用 SIG_BLOCK set为希望添加的信号屏蔽字的信号,相当于mask = mask | set SIG_UNBLOCK set为希望解除的信号屏蔽字的信号,相当于mask = mask & ~set SIG_SETMASK 设置当前信号的屏蔽字为set所指向的值,相当于mask = set set:输入型参数,传入新的信号屏蔽字
oldset:输出型参数,返回旧的信号屏蔽字
返回值:若成功则为0,若出错则为-1
实例:完成对于二号信号的屏蔽
#include <stdio.h>
#include <signal.h>
#include <unistd.h>int main(){sigset_t in_set , old_set;sigemptyset(&in_set);sigemptyset(&old_set);sigaddset(&in_set,2);sigprocmask(SIG_SETMASK,&in_set,&old_set);while(1){printf("hello world\n");sleep(1);}return 0;
}
[root@VM-12-7-centos Blog_Signal]# ./test_sigprocmask
hello world
hello world
hello world
^C^C^Chello world
^Z
[2]+ Stopped ./test_sigprocmask
4.2.4 sigpending
头文件:#include <signal.h>#include <signal.h>
定义:int sigpending(sigset_t *set);
作用:不对pending位图做修改,而只是单纯的获取进程的pending位图
参数:为输出型参数,读取当前进程的未决信号集,通过set传出
返回值:成功返回0,出错则返回-1
实例:屏蔽2号信号,不断地获取当前进程的pending位图,并打印现实,再通过手动发送2号信号,因为2号信号不会被传达,所以会打印在pending表中打印出来。当一段时间后,解除屏蔽,并再次打印pending表
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
void printSigpending(sigset_t *set){printf("Process %d pending:",getpid());for(int i = 1;i<=31;i++){if(sigismember(set,i)){printf("1");}else{printf("0");}}printf("\n");
}
void handler(int signo){printf("give signal :NO.%d ----> Finished\n",signo);
}
int main(){// 信号递达:自定义捕获signal(2,handler);sigset_t iset,oset;sigemptyset(&iset);sigemptyset(&oset);sigaddset(&iset,2);// 信号屏蔽sigprocmask(SIG_SETMASK,&iset,&oset);sigset_t pending;int cnt = 0;// pending打印while(1){sigemptyset(&pending);sigpending(&pending);printSigpending(&pending);cnt++;// 解除屏蔽if(cnt == 5){sigprocmask(SIG_SETMASK,&oset,NULL);printf("signal NO.2 recovery\n");}sleep(1);}
}
[root@VM-12-7-centos Blog_Signal]# ./test_sigpending
Process 3617412 pending:0000000000000000000000000000000
Process 3617412 pending:0000000000000000000000000000000
Process 3617412 pending:0000000000000000000000000000000
^CProcess 3617412 pending:0100000000000000000000000000000
Process 3617412 pending:0100000000000000000000000000000
give signal :NO.2 ----> Finished
signal NO.2 recovery
Process 3617412 pending:0000000000000000000000000000000
^Z
[6]+ Stopped ./test_sigpending
五、信号的处理方式
5.1 信号处理时机
对于信号来说,信号的产生是异步的,当前进程可能正在处理优先级更高的事,信号需要进行延迟处理。对于信号处理的时机,由于信号是被保存在进程的PCB中的pending位图中,当进程从内核态返回到用户态时,进行检测并完成处理工作。
而所谓内核态和用户态的切换是在于用户调用系统函数时,除了进入函数,身份也会发生变化,用户身份编程内核身份。内核态为执行操作系统的代码和数据,计算机所处的状态称为内核态,操作系统代码的执行全都是内核态。用户态是用户代码和数据被访问或者执行时,所处的状态,用户的代码就是在用户态执行的。而二者的区别就是在于权限的区别。
在进程地址空间部分,学习过在进程的地址空间中,如果为32位4GB的地址空间,将会有1G的内核空间,以及3G的用户空间。实际上用户的数据代码和操作系统的数据和代码都是被加载到内存中的,而是通过CPU内有寄存器CR3
保存了相应进程的状态,对于用户使用的是用户级页表,只能访问用户的数据和代码,为用户空间。对于内核,使用的是内核级页表,只能访问内核级的数据和代码,为内核空间。而系统调用就是进程的身份切换到内核,执行内核页表的系统函数,也可以看出无论进程如何切换都是保证了一个操作系统,其实就是每个进程是有3~4G的地址空间,使用了的是同一张内核页表。示意图如下:
5.2 信号处理方式
信号处理的方式为当用户态执行系统调用时,身份转换为内核身份,其中将会进行信号的检测和处理,但进行信号的处理过程中,可能需要自定义捕捉信号,为此还需要进入用户态,去执行信号捕捉方法,最后还需要回到内核态,才执行sys_sigreturn()
函数,返回用户态。图示如下:
当然可能存在疑问,为何第三步为何需要在用户态处理信号捕捉方法呢?是因为操作系统的身份特殊,可能会因为权限过高进行误操作,因此需要回到用户态执行用户态的代码。
5.3 sigaction
头文件:#include <signal.h>
定义:int sigaction(int signum, const struct sigaction *act,struct sigaction *oldact);
作用:检测与改变信号行为,修改handler函数指针数组
参数:
signum:需要修改的信号序号
act:输入型参数,传入结构体
struct sigaction
,其中包含了关于信号捕获方法的内容,而一般常用的是void (*sa_handler)(int);
定义自定义捕获执行函数和sigset_t sa_mask
用来设置在处理该信号时暂时将sa_mask 指定的信号集搁置。struct sigaction {void (*sa_handler)(int);void (*sa_sigaction)(int, siginfo_t *, void *);sigset_t sa_mask;int sa_flags;void (*sa_restorer)(void); };
对于其他成员,本文将不再介绍,有兴趣可以自己查阅资料
oldact:输出型参数,用来传回旧的信号捕获方法
返回值:成功返回0,失败返回-1
实例:捕获2号信号
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <string.h>void handler(int signo){printf("get a signal:NO.%d\n",signo);
}int main(){struct sigaction act;memset(&act, 0, sizeof(act));act.sa_handler = handler;sigaction(2, &act ,NULL);while(1){printf("hello world\n");sleep(1);}return 0;
}
[root@VM-12-7-centos Blog_Signal]# ./test_sigaction
hello world
^Cget a signal:NO.2
hello world
^Z
[8]+ Stopped ./test_sigaction
补充:当某个信号的处理函数被调用时,内核自动将当前信号加入进程的信号屏蔽字,当信号处理函数返回时自动恢复原来的信号屏蔽字,这样就保证了在处理某个信号时,如果这种信号再次产生,那么 它会被阻塞到当前处理结束为止。
如果在调用信号处理函数时,除了当前信号被自动屏蔽之外,还希望自动屏蔽另外一些信号,则用sa_mask字段说明这些需要额外屏蔽的信号,当信号处理函数返回时自动恢复原来的信号屏蔽字。
实例如下:对sa_mask设置三号信号,在二号信号处理时,三号信号将会被屏蔽
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
void handler(int signo){while(1){printf("get a signal:NO.%d\n",signo);sleep(2);}
}int main(){struct sigaction act;memset(&act, 0, sizeof(act));sigemptyset(&act.sa_mask);sigaddset(&act.sa_mask,3);act.sa_handler = handler;sigaction(2, &act ,NULL);while(1){printf("hello world:PID = %d\n",getpid());sleep(1);}return 0;
}
[root@VM-12-7-centos Blog_Signal]# ./test_sigaction
hello world:PID = 3654808
hello world:PID = 3654808
get a signal:NO.2
Killed
[root@VM-12-7-centos Blog_Signal]# kill -2 3654808
[root@VM-12-7-centos Blog_Signal]# kill -3 3654808
[root@VM-12-7-centos Blog_Signal]# kill -9 3654808
六、总结
在本节中,结合生活中对信号的理解,分别从信号前中后三过程发出,介绍了信号的产生、信号的传输、信号的保存和处理方式。在信号的产生一节,主要介绍了各种方式及其信号发送的本质,同样还拓展了程序崩溃的原因及如何获取程序崩溃的错误。再由信号传输进行过度,说明操作系统如何向进程发送信号。再通过信号保存一节,介绍了相应的组织管理数据结构,完成了对于该数据结构的系统调用介绍。最后介绍了关于信号发送后,需要处理的信号发送时机以及信号处理方式。
七、知识补充
7.1 可重入函数
可重入函数指在多执行流中,如果函数一旦重入,不会发生问题,则称为可重入函数,否则称为不可重入函数。该概述较为抽象,以下通过信号进行讲解。
在下图中,main
函数调用insert
函数向一个链表head
中插入节点node1
,插入操作分为两步,刚做完第一步够,因为硬件中断使进程切换到内核,再次回用户态之前检查到有信号待处理,于是切换到sighandler
函数,sighandler
也调用insert
函数向同一个链表head
中插入节点node2
,插入操作的两步都做完之后从 sighandler
返回内核态,再次回到用户态就从main
函数调用的insert
函数中继续往下执行,先前做第一步之后被打断,现在继续做完第二步。结果是,main函数和sighandler先后向链表中插入两个节点,而最后只有一个节点真正插入链表中了。
函数符合不可重入的条件如下:
- 调用了malloc或free,因为malloc也是用全局链表来管理堆的。
- 调用了标准I/O库函数,标准I/O库的很多实现都以不可重入的方式使用全局数据结构。
7.2 volatile
volatile
为C语言的关键字,作用为保持内存的可见性,告知编译器,被该关键字修饰的变量,不允许被优化,对该变量的任何操作,都必须在真实的内存中进行操作,读取必须贯穿式读取,不要读取中间的缓冲区中的数据。
实验示例:通过获取信号的方式来修改全局变量(唯一修改方法),结束主函数循环,当不使用volatile
,若优化编译过程,会导致编译器认为主函数中不会对flag进行修改了,因此直接优化到寄存器中,而不经过冗余的寻址,到内存中读取。而信号修改的是内存的flag,将会导致屏蔽了内存数据。而增加volatile则不会发生该情况。
代码如下:
// 不带volatile
#include <stdio.h>
#include <signal.h>int flag = 0;void handler(int signo){flag = 1;printf("get signal:NO.%d , flag: 0--->1 \n",signo);
}int main(){signal(2,handler);while(!flag);printf("process exit!\n");return 0;
}
[root@VM-12-7-centos Blog_Signal]# gcc -o test_volatile test_volatile.c -O3
[root@VM-12-7-centos Blog_Signal]# ./test_volatile
^Cget signal:NO.2 , flag: 0--->1
^Cget signal:NO.2 , flag: 0--->1
^Cget signal:NO.2 , flag: 0--->1
^Cget signal:NO.2 , flag: 0--->1
^Z
[9]+ Stopped ./test_volatile
// 带volatile
#include <stdio.h>
#include <signal.h>volatile int flag = 0;void handler(int signo){flag = 1;printf("get signal:NO.%d , flag: 0--->1 \n",signo);
}int main(){signal(2,handler);while(!flag);printf("process exit!\n");return 0;
}
[root@VM-12-7-centos Blog_Signal]# gcc -o test_volatile test_volatile.c -O3
[root@VM-12-7-centos Blog_Signal]# ./test_volatile
^Cget signal:NO.2 , flag: 0--->1
process exit!
7.3 sigchld
子进程在终止时,会给父进程发送SIGCHLD
信号,该信号的默认动作是忽略。父进程可以自定义SIGCHLD
信号的处理函数,这样父进程只需专心处理自己的工作,不必关心子进程了,子进程 终止时会通知父进程,父进程在信号处理函数中调用wait
清理子进程即可。
事实上,由于UNIX 的历史原因,要想不产生僵尸进程还有另外一种办法:父进程调 用sigaction
将SIGCHLD
的处理动作置为SIG_IGN
,这样fork出来的子进程在终止时会自动清理掉,不会产生僵尸进程,也不会通知父进程。系统默认的忽略动作和用户用sigaction
函数自定义的忽略通常是没有区别的,但这是一个特例。此方法对于Linux可用,但不保证在其它UNIX系统上都可用。
实例如下:
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>int main(){signal(SIGCHLD,SIG_IGN);pid_t pid = fork();if(pid == 0){int cnt = 3;while(cnt){printf("I am a child\n");sleep(1);cnt--;}exit(0);}sleep(10);return 0;
}
[root@VM-12-7-centos Blog_Signal]# while :; do ps axj | head -1 && ps axj | grep -v "grep" | grep test_sigchld; sleep 1; echo "===============================================================";donePPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
===============================================================PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
===============================================================PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
===============================================================PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
===============================================================PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
3784860 3786590 3786590 3784860 pts/4 3786590 S+ 0 0:00 ./test_sigchld
3786590 3786591 3786590 3784860 pts/4 3786590 S+ 0 0:00 ./test_sigchld
===============================================================PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
3784860 3786590 3786590 3784860 pts/4 3786590 S+ 0 0:00 ./test_sigchld
3786590 3786591 3786590 3784860 pts/4 3786590 S+ 0 0:00 ./test_sigchld
===============================================================PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
3784860 3786590 3786590 3784860 pts/4 3786590 S+ 0 0:00 ./test_sigchld
3786590 3786591 3786590 3784860 pts/4 3786590 S+ 0 0:00 ./test_sigchld
===============================================================PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
3784860 3786590 3786590 3784860 pts/4 3786590 S+ 0 0:00 ./test_sigchld
===============================================================PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
3784860 3786590 3786590 3784860 pts/4 3786590 S+ 0 0:00 ./test_sigchld
===============================================================
补充:
- 代码将会放到: https://gitee.com/liu-hongtao-1/c–c–review.git ,欢迎查看!
- 欢迎各位点赞、评论、收藏与关注,大家的支持是我更新的动力,我会继续不断地分享更多的知识!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.exyb.cn/news/show-4505675.html
如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!
.md文件格式详解,即markdown文件语法(图文并茂),新生代农民工必备技能
示例源码 lishuoboy-markdown CSND 目录 介绍 0.目录[toc] 1.标题(#) 2.段落(空行) 3.换行(2个空格或\) 4.文字格式(*) 5.引用(>) 6.列表&…...
Geek Talk 034:消费升级大环境下的空间设计
主题:消费升级大环境下的空间设计时间:6月28日 19:00 - 21:00地点:报名确认后,邮件和微信通知邮件发送详细地址,请确保邮箱地址和 微信ID 正确人数:30人 嘉宾:史洋史洋 Founder of hyperSityhy…...

DX12_Mesh Shader Instance
之前我们介绍过DX12_Mesh Shaders Render,但是基于MeshShader我们能做的还很多,比如实例化和剔除(视锥与遮挡),这也就直接解决了现在主流的GPU-Driven管线方法,是不是一举两得了(毕竟MS就是变种…...

vue展示md文件
先安装插件,可以用来编辑md文件,和展示文件: npm install mavon-editor -S在全局中引用 // 引入makrdown插件 import mavonEditor from mavon-editor import mavon-editor/dist/css/index.css Vue.use(mavonEditor)然后,你发现导…...

Vue中读取md文件
在Vue中读取本地的md文件。 第一步:在Vue项目中安装依赖 cnpm i markdown-loader html-loader --save 第二步:打开build/webpack.base.config.js,在module下的rules中配置,配置成功后需要重启项目。 {test: /\.md$/,use: [{ lo…...

邓白氏编码申请流程
进入网址https://developer.apple.com/enroll/duns-lookup/#!/search(一般默认申请的都是没有的,但是这一步是少不了的) 法人实体名称一栏:填写公司名字的全称 界面如图所示: 申请邓白氏界面,填写公司信息…...

邓白氏编码 申请
一.德国:http://my.oschina.net/tearsky/blog/190950?fromerrN1GGmzcC 打开D-U-N-S官网 http://fedgov.dnb.com/webform二.美国:http://www.imspm.com/show-47-2642-1.html转载于:https://www.cnblogs.com/liudongyan/p/5162641.html...

申请苹果开发者公司账号和邓白氏编码全流程
现在苹果开发者账号支持Apple Developer APP注册了,我们介绍的方法就是通过Apple Developer APP注册苹果开发者账号。 苹果开发者公司账号的申请条件: 一个公司苹果账户Apple IDD-U-N-S编号-邓白氏编码苹果手机安装好Apple Developer一个网站办理授权文…...

深佰特 NFC 读卡模块适用说明介绍
读卡模块概况: 支持 13.56MHZ ISO14443 typer A B 协议; 可以支持读写的卡片类型有:M1 卡、CPU 卡、身份证卡,Ntag 标签卡等等(烧录不同的软件版本); 可支持 Android 手机 NFC 进行数据通信&…...

分享6个对象数组去重的方法
大家好,关于对象数组去重的业务场景,想必大家都遇到过类似的需求吧,针对这样的需求,你是怎么做的呢。下面我就先和大家讨论下基于对象的某个属性如何去重。方法一:使用 .filter() 和 .findIndex() 相结合的方法使用 fi…...

iOS-申请邓白氏编码的超详细流程介绍
IOS开发账号除了个人开发者账号外,其他组织或企业开发者账号均需要邓白氏码。下面我就来讲申请邓白氏码的步骤记录下。 一、华夏邓白氏官网申请 进入华夏邓白氏官网:https://www.huaxiadnb.com/duns-registered-solution.html?utm_source=baidu&utm_medium=cpc&utm…...

邓白氏编码申请最后提交资料格式
邓白氏编码申请最后提交资料格式 一、邓白氏编码资料格式说明: 在申请苹果企业开发者账号之前,需要先申请邓白氏编码,你进入邓白氏官网提交相关申请资料之后,等1-2周左右,如果审核正常的话,最后会给你打电…...

跟我一起来申请邓白氏编码
接上篇苹果开发者账号申请 1、在下面页面中 2、点击D-U-N-S编码进入下面页面 3、进行下述操作,若你的公司有这个编码将会查出,如没有,就要点击提交 4、提交后当天或第二天回收到邓氏编码方的邮件 5、一般会在邮件所约定时间之前再发送你一封…...

avg在python中的意思_一个简易的AVG游戏模板(python)
from tkinter import *class Settings:WIDTH 800HEIGHT 600class Game:def init(self):self.sm StepMaster()textPage TextPage(["难忘的小事","long time ago","theres a little girl"])textPage1 TextPage(["suddenly a pig rushed …...

移动大数据植入洛阳旅游管理
洛阳市旅游发展委员与中国移动通信集团河南有限公司洛阳分公司合作建设的移动公司大数据游客分析系统近日上线试运行。3月9日下午,双方签订战略框架合作协议。 该系统是依托分公司强大的客户规模优势及大数据分析能力,通过基站信令数据、业支系统数据等渠…...

邓白氏编码申请简要
在苹果官方申请邓白氏编码是免费的,所以自动动手,冤枉钱就不要花了。 邓白氏申请入口:https://developer.apple.com/enroll/duns-lookup/ 通过上面的链接申请邓白氏编码完全免费,苹果会将开发者的申请直接发到邓白氏总部ÿ…...

Leetcode 472. Concatenated Words
题目 解法: 利用word break解法即可 注意: c在写的时候,这个参数一定要传引用,不然会占据很大的时间,比如下面的unordered_map<string,bool> &d,如果不传引用会tle像这边的d可以直接用unordere…...

[Jetson][转载]jetson上安装pytorch+torchvision教程
1. Jetpack默认已安装opencv、cuda、cudnn,故只需再安装pytorch即可,留意jetson是arm架构,需要下载对应的安装文件加以安装 2. pytorch的安装 查询Jetpack的版本 sudo -H pip3 install jetson-stats jetson_release pytorch的whl文…...
微软修复了国家安全局上报的Windows严重漏洞
微软于本周二发布了一项安全更新,修复影响Windows操作系统的49个漏洞,其中包括一个由美国国家安全局上报的“影响广泛的加密漏洞”。 美国国家安全局(NSA)网络安全主管Anne Neuberger在近期的新闻发布会上确认了这一事实…...

教程:readme.md文件基础使用
1.如何在readme.md文件中添加图片: 将图片文件上传到github项目仓库的文件夹下,上传成功后,打开上传的图片,在地址栏得到图片链接并复制,编辑插入到README.md文件中: 前面是其特定格式,…...

Dev C++ 显示warning Source file not compiled,附带下载软件链接
环境: Window 10 64位系统 问题描述: Dec C的下载与安装,一直记得不用自己安装C/C的编译器就可以编译编写的文件,Dev C显示已经success,但是运行的时候就是显示如下图片的问题 解决方案: 百度,好多的方案都没用&…...

Web中间件常见漏洞总结
IIS IIS是Internet Information Services的缩写,意为互联网信息服务,是由微软公司提供的基于运行MicrosoftWindows的互联网基本服务。 IIS目前只适用于Windows系统,不适用于其他操作系统。 解析漏洞 IIS 6.x 基于文件名 该版本默认会将*…...

【JS】快速入门DOM
目录 节点树 DOM属性 DOM方法 操作节点属性 操作节点文本 操作节点样式 事件绑定 节点获取方法 批量添加事件 事件对象 获取鼠标位置 节点树 概述:节点即为标签。节点之间这种关系,我们称之为‘节点树’。因为很想一颗大树扎根。 DOM【document object m…...

mysql三范式通俗_三范式(数据库三大范式通俗理解)
范式是符合某一种级别的关系模式的集合。关系数据库中的关系必须满足一定的要求,满足不同程度要求的为不同范式。【中文名】: 范式【外文名】: paradigm【性 质】.第一范式(1NF):在关系模式R中的每一个具体关系r中,如果…...
测试案例
测试案例是贯穿了整个测试流程和项目研发流程的,因此用例显得至关重要。如何提高用例的质量,用例评审是必不可缺的一环。 很多测试同学都知道应该做测试案例评审,并且也乐意做需求评审,但是很少有测试同学总结过如何做案例评审。…...

CANopen 7.过程数据对象 PDO Process data object)
学习:https://blog.csdn.net/iamplane/article/details/49931319 同步报文使用:https://blog.csdn.net/qq_40104597/article/details/106476609 7. 过程数据对象 PDO Process data object) 如前文所述PDO属于过程数据用来传输实时数据,即单向传输,无需…...
APP推广 从零开始
现在有越来越多的企业都在开发属于自己的APP,包括各种行业的应用,如社交类APP、生活类APP、购物类APP甚至两性类的APP都不在少 数。然而,这些APP开发出来都会遇到一个共同的问题,也就是如何去推广,一个产品如果没有推广…...

web服务器,web中间件,web容器的区别
web服务器,中间件,web容器web服务器中间件web容器结论前言:才学习的时候,就听过大名鼎鼎的web服务器,apache,iis,tomcat,后面进一步学习的时候,发现有个web中间件的东西&…...

App Store上架之邓白氏编码申请
要申请邓白氏编码(相当于企业的身份识别码 ,详情请百度),apple官网有提供申请入口进行免费申请申请入口 i. 公司名(英文) ii. 公司的地址,(英文)(会打下面的电…...

6-2 输出月份英文名 (10 分)
本题要求实现函数,可以返回一个给定月份的英文名称。 函数接口定义: char *getmonth( int n ); 函数getmonth应返回存储了n对应的月份英文名称的字符串头指针。如果传入的参数n不是一个代表月份的数字,则返回空指针NULL。 裁判测试程序样…...
申请邓白氏(D-U-N-S)编码
申请邓白氏编码步骤其实很简单,我们所说的前提是你已经有了AppleID(假设你已经有了,如果没有的话,就用一个邮箱账号去申请一个,非常简单) 第一步:登录苹果官网苹果官网。 第二步:直…...

如何实现全网拉新引流,知识店铺留存转化?
随着互联网的迅猛发展,在线教育已是大势所趋。越来越多企业、机构完成了线上化、数字化转型,将知识搬到线上,借助线上工具和互联网来实现更大范围的传播,高效拉新留存。 下面,我们以知识场景数字化服务商创客匠人为知识…...

如何申请公司邓白氏编码(D-U-N-S Number)
申请邓白氏码之前,需要查询一下公司是否已经申请了邓白氏码,这一步无法略过。点击查询邓白氏码,点击后会跳转至下图界面。 由于我这里是给过国外账号申请,界面是英文,如果是国内账号,应该会是中文。但是所填…...

六级(2021/6-1) Text1
Humans are fascinated着迷的 by the source of their failings and virtues. This preoccupation inevitably leads to an old debate: whether nature or nurture moulds us more. A revolution in genetics has poised this as a modern political question about the chara…...

JS常见事件类型
JS常见事件类型 名称含义blur失去焦点focus获得焦点load加载resize重置大小scroll滚动unload卸载click点击dblclcik双击mousedown鼠标按下mouseup鼠标弹起mousemove鼠标移动mouseover鼠标悬停mouseout鼠标移走mouseenter鼠标移入mouseleave鼠标离开change内容改变select选中su…...

Python3 NumPy库之ndarray数组
在Python内置环境 中,直接存储数值的数组(array)对象只存在一维结构,无法支持多维结构,也没有相关数组运算函数,这些使得Python在数值运算上有诸多不便之处。为了弥补这些不足,第三 方函数库NumPy被整合开发出来。 Nu…...

邓白氏编码申请地址,DUNS
邓白氏编码申请地址 用appleid登录 https://developer.apple.com/enroll/cn/duns-lookup/#!/search 先查询,如果没有,会直接用查询的信息,可直接申请邓白氏编码...

人工智能和机器学习如何影响金融服务?
文章来源:ATYUN AI平台 我们总是听到机器人或机器将代替人类工作,我们的工作场所将发生巨大变化的言论。事实上,未来确实会如此,我们可以计划何时开始,但是,就像其他事情一样,我们不清楚何时是…...

程序设计基础系列作业(湖南师范大学)
第1关:判闰年 任务描述 输入一个年份,保证在[0,3000]之间 判断该年份是否为闰年。 输入只有一个int,范围在[0,3000] 输出一个单词,如果是闰年输出Yes,否则输出No。注意大小写。 #include<iostream> using namespace std; int main() {int n;cin>>n;if((n...

2021申请邓白氏编码最新操作手册
https://developer.apple.com/enroll/duns-lookup/ https://developer.apple.com/support/D-U-N-S/ 如果提交了直接查询; 邮件申请: 尊敬的xxx,您好: 感谢您联系 Apple Developer Program 支持团队,我是资深 Advisor&…...

README.md文件
引言: README.md文件用的是Markdown编写的,所有我们先来看看Markdown的语法 首先在github上面某个项目里面创建一个README.md,然后在里面区编辑内容,如图, 点击edit file在下面输入内容,然后切换到preview changes进…...

Matlab——zeros函数和ones函数
一、两者的基本作用 zeros函数——生成零矩阵 ones函数——生成全1阵 二、【zeros的使用方法】 Bzeros(n):生成nn全零阵。 Bzeros(m,n):生成mn全零阵。 Bzeros([m n]):生成mn全零阵。 Bzeros(d1,d2,d3……):生成d1d2d3……全…...

邓白氏编码申请地址
本文主要介绍邓白氏编码申请的地址及申请材料 https://developer.apple.com/enroll/duns-lookup/#!/search申请材料 1.提供公司清晰的证件照片 A.营业执照 B.公章实物底部照片 2.公司 中文名称: 英文名称: 3.实际地址 中文:xx 英文ÿ…...

c语言公司考勤系统
1.要求 考勤系统是公司人事管理重要环节,用于记录员工迟到、早退、缺席、请假等出勤情况,并能提供数据统计功能。系统需求如下: 认证用户,如密码方式; 设置上下班时间,并能判断是否迟到、早退; 记录出勤状况,能记录每日…...

md文件语法及目录使用
标题的使用 # <h1> ## <h2> ................ 空格的使用 换行的使用 ①段落换行 回车 ②普通换行 space space回车 > 解释 注释 - list 段落前 加 表格 |参数名|参数说明|是否必须| |:---:|:---:|:---:| |username|用户名|是| |password|密…...

ESP8266 SDK开发环境搭建及HelloWorld编程教程
最近在学习ESP8266,虽然网上已经有很多很详细的教程,但我照着做时也踩了不少坑,现将我采用的方法总结出来,希望对大家有帮助。 一、工具准备 准备工作:下载ESP8266_NONOS_SDK、软件AiThinkerIDE_V1.5.2、烧录固件工具…...

手把手教你修改butterfly主题的样式
提要 很多小伙伴私信我,想让我谈谈主题样式如何修改,如何添加css和js。所以这里我特意写一文,进行说明,对主题修改主要以下两个方法: 外部挂载代码(推荐)直接修改源码 我是推荐外部挂载代码的…...
postman 使用
简单说明下postman的有关使用,如创建环境变量,使用变量,参数化 ,检查点等 1. 创建环境变量 send请求一次新建bug,然后将响应结果中需要的参数保存为一个变量“pbug_id” 确认下参数取值是否正确: 2. 使用参数 通过{{pbug_id}…...

funcode综合教程 桌球
//----------------------------------------------------------------------------- // //----------------------------------------------------------------------------- #include "CommonAPI.h" #include "LessonX.h" #include<bits/stdc.h>...

无网络maven私服添加jar和pom
1.登录nexus 用管理员账户登入后,在3rd party修改配置Deployment Policcy为:Allow Redeploy。 2. 上传jar 一般jar和pom都要上传! 在artifact upload界面选择: packaging jar (1)GAV Parameters (2)select Artifact to upload (3)add artifact (4)…...

行人检测,可以通过视频,检测视频中出现的行人
行人检测,可以通过视频,检测视频中出现的行人,运用SOBEL算法,跟踪检测效果很好id631391409485&...

vue显示md文件
vue显示md文件 环境搭建 <1>安装依赖库 cnpm i markdown-loader html-loader --savecnpm i showdown --save<2>build/webpack.base.conf.js添加 { test: /\.md$/, use: [ { loader: html-loader }, { loader: markdown-loader, options: {} } ] }<3>main.…...

基于voerlap的相似性度量-单细胞克隆亚型分析
基于voerlap的相似性度量-单细胞克隆亚型分析 一、背景 基于overlap的相似性度量,有多种多样的方法,其应用也是多种多样。这里,我们主要讲解在单细胞免疫组库中的应用。 基于单细胞的免疫组库的测序,我们可以获得每一个细胞类群…...

多态的实现机制是什么?(面向对象技术)
常见笔试题: Java 中提供了哪两种用于多态的机制?(留下你的答案吧) 多态的实现机制是什么? 多态是面向对象程序设计中代码重用的一个重要机制,它表示当同一个操作作用在不同对 象时,会有不同的语…...

数组去重和数组扁平化
数组去重我们不但会在平时的开发中用到,就是面试也是高频出现的一道题,面试官的目的主要是想了解我们对基础知识的掌握以及是否能用更优雅的方法去实现。 数组去重 以下几种方法均采用 const arr = [1, 1, 2, 3, 3, 4, 5, 5, 6, 7, 7, 8, 9, 9, 10]双循环去重 主要思想就是定义…...

软件质量保障之代码走查
目的代码走查有几个目的,第一个是让新同学快速熟悉代码并了解系统。第二个是做咨询防控的事前检查,避免引发线上故障。第三个是通过一起讨论和审查,加强团队代码阅读和编写能力,让大家编写出优秀的代码。代码走查的优点非常多&…...

邓白氏编码的申请流程
邓白氏编码是由9位数字编制而成的全球唯一企业身份标识,相当于人民的身份证号。接下来走一波申请流程。 提示: 操作之前请先准备一个 Apple ID,个人信息名称要用英文,要不然申请邓白氏编码时有可能会因为格式不正确被驳回。 一、…...

剑指 Offer 35. 复杂链表的复制
请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。 示例 1: 输入:head [[7,null],[13,0],[11,4],[10,2…...
无人机视频的电子稳像
无人机视频的电子稳像 http://blog.csdn.net/u011326478/article/details/53236508 1.小型无人机数据介绍 1.1 图像介绍: 1. 影像航向重叠度和旁向重叠度都不够规则;2. 像幅较小、像片数量多;3. 影像的倾角过大且倾斜方向没有规律;…...

C语言学习笔记(八)
C语言学习第八天,今天主要学习函数参数和字符数组 1.8 参数——传值调用 在C语言中,被调函数不能直接修改主调函数中变量的值,而智能修改其私有的临时副本的值。传值调用的利大于弊。在调用函数中,参数可以看作是便于初始化的 局…...

stack smashing detected(c++报错)
stack smashing detected(c报错)stack smashing detected这种错误在网上一查一大把,无非很多讲的都是内存溢出、生命周期结束等等,其实道理都是访问了越界的地址。简单的越界看看代码很容易就找到了,复杂的代码可以看看…...

IPC Send timeout detected模拟和总结
在多节点的集群日志中,经常会看到一些IPC Send timeout detected的报错,有的时候是偶尔报一次,数据库层面也看不出什么异常,如果一段时间大量出现了IPC Send timeout detected的报错,可能会导致实例被驱逐。 下面看一…...

stack corruption detected问题探究
问题现象 复现步骤 Android 7.0平台 安装手机百度apk(v8.6.5) 启动App后必现native crash 分析定位 初步分析 tombstone文件如下 *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** Native Crash TIME: 959207 *** *** *** *** *** *** *** *** *** *** *…...

简单内存泄漏检测方法 解决 Detected memory leaks! 问题
来源:http://www.cnblogs.com/G_Weber/archive/2009/04/15/1436362.html 我的环境是: XP SP2 . VS2003 最近在一个项目中,程序退出后都出现内存泄漏: Detected memory leaks!Dumping objects ->{98500} normal block at 0x05785AD0, 152 bytes long.Data: <…...

win10电脑开机绕过密码自动登录,微软官方提供修改注册表跳过登录设置方法
有时候电脑异常重启,默认开机后由于必须登录导致很多开机启动项无法自动运行失去远程控制。 而且之前使用 netplwiz 用户账户设置自动登录的方法已经不能用了。 最新电脑自动登录设置方法: 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\Cu…...

计算机桌面堆,桌面堆栈分配失败,修改桌面堆栈大小
大家在使用计算机是否遇到过下面的问题呢?当运行大量的程序时,在您尝试开启新的程序或者使用正在运行的程序时,出现”Out of Memory”(内存不足)错误信息,即使您的计算机仍然拥有充足的物理内存和页面文件内存。这个问题是由于桌面…...

Windows 注册表相关API总结
目录一、注册表简介几个根键的用途说明:二、常用API介绍1.RegCreateKeyEx() 创建注册表键关于KEY_WOW64_32KEY/KEY_WOW64_64KEY几点说明2.RegOpenKeyEx() 打开注册表3.RegDeleteKeyEx() 删除注册表键4.RegCloseKey() 关闭注册表句柄5.RegSetValueEx() 写注册表6.Reg…...

自动化测试 (五) 读写64位操作系统的注册表
非Web程序(桌面程序)的设置一般都存在注册表中。 给这些程序做自动化测试时, 需要经常要跟注册表打交道。 通过修改注册表来修改程序的设置。 本章介绍如何利用C#程序如何操作注册表, 特别是如何操作64位操作系统的注册表。 阅读…...

c++ 注册表操作
一、注册表简介 注册表是为Windows NT和Windows95中所有32位硬件/驱动和32位应用程序设计的数据文件,用于存储系统和应用程序的设置信息。16位驱动在Winnt (Windows New Technology)下无法工作,所以所有设备都通过注册表来控制,一般这些是通…...
Unicorn反混淆:恢复被OLLVM保护的程序(一)
一、目标 现在很多程序利用ollvm的控制流平坦化来增加逆向分析的难度。 控制流平坦化 (control flow flattening)的基本思想主要是通过一个主分发器来控制程序基本块的执行流程,例如下图是正常的执行流程 1:show1 经过控制流平坦化后的执行流程就如下图: 1:show2 …...

如何让计算机桌面自动更换,怎么让电脑自动更换桌面背景
Windows 7支持多张桌面背景切换的功能让我们的桌面更加绚丽,那么怎么让电脑自动更换桌面背景?学习啦小编为大家整理了相关资料,供大家参考!电脑自动更换桌面背景参考如下◎ 系统方案的局限之处关于另选桌面背景的问题,Windows 7提供了两种不…...

小米手机刷魅族系统会对手机本身有损伤吗?
肯定会有损伤,严重可能会让手机瘫痪,小编同学之前用一加刷miui系统,结果相机怎么都打不开,最后还要刷回来,bug比较多,我们一定要清楚手机的优化需要软硬结合,比如同样是miui10红米note4高通版和…...

魅族账号退出服务器繁忙,白忙活!小米魅族微博抢热度,结果还是不敌荣耀这一招...
今天真是多事之日。就在早上,小米正式对外宣布,将定档10月25日在北京召开新品发布会,届时将会推出小米全新大作——小米MIX 3。正当我们以为,下周只有小米一个主角的时候,小米的老冤家魅族也正式对外宣布,将…...

魅族升级鸿蒙,魅族升级鸿蒙,是蹭华为热度,还是布局未来?小米的态度透着精明...
随着华为鸿蒙系统的发布会即将召开,业界关于鸿蒙系统第三方厂商适配问题十分关注。众所周知,随着华为手机出货量的下滑,想要在手机上扩展鸿蒙用户群并不容易,所以华为正在寻求更多的厂商适配鸿蒙系统。目前比较准确的消息是&#…...
复盘小米魅族大战,1499 红米是假,小米4 降价是真
小米魅族大战稍歇一段。但笔者深信这仅是暴风雨前的平静。国庆前再复盘来看整场国产手机历史上旷世之战,可以嗅出诸多端倪。端倪一 :1799 击中小米命门按照小米的风格,非同一体量的公司无论怎么***小米,小米也不屑回应。因为一旦…...

Android悬浮窗适配全机型,包含8.0,小米魅族华为悬浮窗权限适配demo看这一篇就够了
机型多杂,适配无法完全兼容,不如换种实现方式,性能比悬浮窗好,不需要权限,效果更好:https://blog.csdn.net/m0_38058826/article/details/103993392 悬浮窗插入接口 在实现悬浮窗之前,我们需要…...
Android_小米魅族测试时提示INSTALL_FAILED_USER_RESTRICTED错误的问题
小米手机安装AS的debug项目时提示如上问题,点击OK后仍无法安装.解决方法: 1.(小米)打开开发者选项,开启USB调试和USB安装 2.魅族 手机管家->权限管理->usb安装管理->关闭 3.小米手机测试最好插上一张电话卡,在红米5A上出现过不插电话卡无法安装调试app的情况...

解密小米魅族等网站在可视区域加载动画
用这个:http://www.cnblogs.com/aliyue/p/6742717.html 废话不多说,直接上DEMO下载地址:http://download.csdn.net/detail/cometwo/9602499 参考链接:http://www.dowebok.com/134.html 和 WOW.js 一样,scrollReveal…...

一加5android auto,一加5、5T升级到Android8.0并增加人脸解锁,小米魅族表示羡慕
原标题:一加5、5T升级到Android8.0并增加人脸解锁,小米魅族表示羡慕今天早上一加官网发布OnePlus 5、5T系统升级的通知,OnePlus 5、5T同时升级到Android8.0,并且增加人脸识别功能。其中OnePlus 5增加了以下功能:录音机…...

修改小米魅族状态栏颜色
/** * 修改小米状态栏颜色 * param activity * param darkmode * return */ public static boolean setMiuiStatusBarDarkMode(Activity activity, boolean darkmode) { Class<? extends Window> clazz activity.getWindow().get…...

看小米魅族对比视频想到的
小米是个神奇的公司,完全定义了一个模式。魅族也是个神奇的公司,做出的产品总会有很多奇奇怪怪的问题,但是又那么带感。 产品态度: 小米和魅族ROM的理念完全不一样。 小米是个互联网人的态度,所有东西都能用&#x…...

小米魅族系统遇到的6.0权限不弹窗问题
最近在工作中遇到了一个问题,在小米手机上,调用6.0申请权限的api,很久才弹出权限申请框或者不弹。我们的逻辑是在进入一个Fragment,在onViewCreated方法中,判断是否有读取联系人的权限,如果没有就申请权限&…...

收集用户网络行为数据 研究对此进行特别调查
很多人应该有相同的经历。在搜索感兴趣的内容后,他们将在浏览网站后不久看到相关广告。近年来,这种行为瞄准已经成为数字广告的一个主要趋势,但华尔街日报援引最新研究的话说,除了让用户感到不舒服之外,这类广告的有效…...

普通本科生的大学课程
做一次真正的改变记录大学的所有课程记录大学的所有课程 大学所有课程:微观经济学,电子商务专业导论,思想道德修养与法律基础,大学计算机实验基础,军事理论,Java程序设计, Java程序设计实验&am…...

【保研加分项】本年度最全大学生竞赛汇总
【保研加分项】本年度最全大学生竞赛汇总 一、本校保研资格加分项: 随着近几年保研政策的开放,保研早已经不是只有成绩好就能获得保研资格的“玩法”。我们对2019年各大高校保研政策进行了研究,发现大部分211及以上的院校,在保研…...

关于富顺豆花及其经营的调查报告
关于富顺豆花及其经营的调查报告 简介:千年古城富顺,有着“巴蜀才子之乡”的美誉。有着文庙、西湖、千佛寺、青山岭等旅游景点。而让很多人了解富顺的,还是它的豆花,因此,它也被誉为“中国豆花之城”。富顺豆花&#…...

2019戴森设计大奖正式启动,助力青年发明人才
今年,戴森设计大奖(James Dyson Award)已经迈入了第十五个年头,这项由詹姆斯•戴森基金会设立的大奖旨在鼓励新生代工程师以创意性的设计为人类的未来带来积极影响。大奖号召富有创新和创业精神的在校学生和新近毕业生针对具体问题…...

大学生竞赛汇总
CSDN话题挑战赛第1期 活动详情地址:https://marketing.csdn.net/p/bb5081d88a77db8d6ef45bb7b6ef3d7f 参赛话题:大学生竞赛指南 话题描述:本话题聚焦于大学生竞赛心得体会分享,对于计算机众多领域每年都有很多都会举办科技竞赛…...

计算机中负数的存储
1. 负数的存储 signed char 的范围 -128~127 1000 0000 ~ 0111 1111计算机中用补码存储,负数的补码是按位取反变成反码再加一得到补码 -9 原码 1000 1001 反码 1111 0110 补码 1111 0111 -8 原码 1000 1000 反码 1111 0111 补码 1111 1000 -7 原码 1000 0111 反码 1…...

C++实现计算器,运用栈,输出后缀表达式,有负数、小数处理
#include <iostream> #include <stack> #include <vector> #include <string> using namespace std; enum Member_type{NUM, SIGN }; struct member {member(double n) {m_type NUM;num n;}member(char n) {m_type SIGN;sign n;}Member_type m_ty...

语言计算器负数小数c,C++语言课程设计(负数计算器)东北大学秦皇岛分校.docx
C语言课程设计(负数计算器)东北大学秦皇岛分校汇编C语言课程设计(小型复数计算器)班级学号2143521 2143503 2143507 2143524学生姓名王劲翔赵冉郭子昕芦鹭提交日期2015年7月23日成绩计算机与通信工程学院题目用C编写一个小型复数计算器请用面向对象方法设计并实现一个小型复数计…...

51单片机矩阵键盘实现基本计算器功能(包括负数)
功能实现 加(12)减(13)乘(14)除(15) 等于(11),清0(K3),退位(K4),在第一次运算结果上继续运算&am…...

Qt实现计算器(支持负数和小数)
计算器主要用到的知识比较简单,中缀表达式和后缀表达式,后缀表达式求值,以及栈这种数据结构,图形界面主要只用到了Qt的push button和label,计算器支持了两位数以上,小数和负数。 效果图: 源码:https://github.com/g10…...

java计算出现负数吗,请问一个计算器的有关问题,怎么实现负数计算
请教一个计算器的问题,如何实现负数计算?百思不得其解,是别人的代码,在自己电脑运行,居然负数运算不了。 自己想不出它的代码了,要做负数运算的时候出错。 比如: -3-2 ;-10-5&…...

c#简单的科学计算器(实现功能:括弧 负数 小数运算)
wdnm,你说俺一个学信息安全的,为啥要学c#呢。。。。。哎。。都是实验室逼得。。。。学长还一个比一个消极。。。你说俺咋整啊。。。。 初学学了三四天c#,学长让我实现一个计算器,难度还是大大的。。。 写的很简单。。。也很笨拙。…...

JavaScript应用:简单计算器的实现
JS实现简单计算器 页面布局设计(HTMLCSS) 由于在之前的博客中有对html和css进行详细的讲解,再次就不多叙述,直接上代码。因为js中用到了JQuery选择器所以在html中使用<script></script>标签引入了JQuery,在html中为每…...

删除c盘itunes备份_如何查找,备份和删除iTunes备份
删除c盘itunes备份When you sync your iPhone or iPad with iTunes, it creates a backup on your computer in case you lose your device–or get a new one. The problem is, they take up a lot of space. If you need to purge some old iTunes backups of your iOS devic…...

关于计算机发展的辩论赛,计算机辩论赛策划书
《计算机辩论赛策划书》由会员分享,可在线阅读,更多相关《计算机辩论赛策划书(5页珍藏版)》请在人人文库网上搜索。1、计算机系第四届辩论赛-策划书【活动宗旨】大学是一个展现您非凡魅力的舞台,是一节通向您成功的阶梯。菁菁校园,莘莘学子,迈入新生活。…...

辩论赛计算机软件更重要论据,善意的谎言辩论会正方观点要例子
一般我们辩手都要为自己的观点添加实例,下面是小编搜集整理的善意的谎言辩论会正方观点要例子,欢迎阅读。更多资讯请继续关注辩论赛栏目!我认为,诚信是至关重要的。不论是善意的谎言还是普通的撒谎,都不应该常常出现。善意的谎言&…...

如何使用python语言而辩论
几分钟之后有人问我Python的用法(usage),而这篇文章没有提及,但却是一个让人深思的问题。我们看到,使用Python的用户很可能在未来保持高位,但是Python是否会被用到尽可能多的项目中是不能保证的;用户(users)数目很多而…...

大白话之辩论DDD,阿里面试中台化理解
大家好,我叫大鸡腿,大家可以关注下我,会持续更新技术文章还有人生感悟,感谢~ 前言 我在最近一年经常听到大家在讨论DDD,而且议论纷纷,大家各抒己见。 比如说在某技术微信群讨论,有些人说DDD是…...

光纤内窥镜物镜光学设计
光纤内窥镜物镜光学设计 工作原理 典型的光纤传像束内窥镜主要由前置物镜、光纤传像束、目镜/耦接镜、 探测器等组成,如图1所示。通过物镜把目标成像于光纤传像束的前端面上,该端面上的图像被离散分布的大量光纤采样,每根光纤都有良好的光学…...

人间不值得。在既定的规则面前,除了遵守,还能有什么?
看完本周的两集奇葩说,一句话:哈哈,不出我所料。1.周五是邱晨战队vs肖骁战队,不看比赛我就说邱晨赢。结果大家都知道了,肖骁战队输了,走了马剑越。虽然猜中了结果但过程还是很揪心的,陈铭仍然是…...

如何为使用Python语言而辩论
最近我写了一篇关于我为什么不担心Python流失用户的文章。几分钟之后有人问我Python的用法(usage),而这篇文章没有提及,但却是一个让人深思的问题。我们看到,使用Python的用户很可能在未来保持高位,但是Python是否会被用到尽可能多…...

浅谈辩论赛
浅谈辩论赛 2011年04月06日浅谈辩论赛――关于辩论赛多年的经验积累本篇文章是个人经过多年实战与观战总结所得,主要围绕在辩论赛中容易出现的问题来探讨的,列举的实例不多,生动性不够,但相信大凡认真阅读本文者,总会…...

辩论技巧
辩论赛技巧之基础知识[转贴]2009-05-22 19:33辩论本来是一种探求真理的手段。在古代欧亚大陆,那些雄辩家几乎都是名噪一时的思想家,他们的思想火花直接闪现在他们的唇枪舌剑中,几乎不必思考什么战术,一切似乎是信手拈来࿰…...

IBM的Project Debater系统,在与人类的辩论中取得胜利
内容来源:ATYUN AI平台 IBM的计算机在1997年国际象棋比赛中计算机击败了人类,如今计算机在一场更加微妙的竞争中取得了胜利,那就是辩论。 IBM创建了一个名为Project Debater的系统,该系统在公司所谓的计算论证中竞争:…...

WordPress自定义帖子类型辩论– Functions.php还是插件?
As many of you know, this past week Syed Balkhi attended WordCamp Raleigh 2012. During the event, one of his tweets sparked quite a debate. In this article, our founder Syed Balkhi will debate whether WordPress Custom Post Types belong in functions.php fi...
2020年AI学术界一场突如其来的辩论:到底什么是深度学习?
2020-01-18 04:13:31 作者 | 杨晓凡编辑 | Camel 编者按:2019 年底、2020 年初,许多机器学习界活跃的教授、研究员们投身参与了一场的突如其来的讨论:到底什么是深度学习? 在过去十年汹涌而来的深度学习浪潮中,大家对深…...

应该用BPM管理业务规则吗?
文章发布于公号【数智物语】 (ID:decision_engine),关注公号不错过每一篇干货。 作者 | Carole-Ann Berlioz 译者 | Teki.D MarkNorton 评论了我的算法文章,并启发我写了这篇关于 BPM 和业务规则的后续文章。 自上世纪…...

ESLint语法检查--semi(分号)规则
英文地址:https://eslint.org/docs/rules/semi JavaScript 在众多的类C语言中是独一无二的,因为它不需要你在每个语句的末尾添加分号。在多数情况下,JavaScript 引擎能够自行确定在某个位置是否需要分号,并在需要时为我们自动添加…...

罗伯特议事规则
议事规则的12条基本原则(极简版) 第1条、动议中心原则 动议是开会议事的基本单元。“动议者,行动的提议也。”会议讨论的内容应当是一系列明确的动议,它们必须是具体、明确、可操作的行动建议。先动议后讨论,无动议不讨…...

辩论逻辑_例外辩论
像C 一样,Java语言提供了引发和捕获异常的功能。 但是,与C 不同,Java语言支持检查和未检查的异常。 Java类必须声明它们在方法签名中抛出的所有已检查异常,并且任何调用引发E类型的已检查异常的方法的方法都必须捕获E或也必须声明…...

关于长尾的辩论
原来外国的blogger也掐架啊。长尾理论创始人Chris Anderson对华尔街时报的Lee Gomes的 评论如下:But sometimes the lure of the gotcha is too much to resist-- 有时候有人就是忍不住想鸡蛋里挑骨头。这篇是A VC由这段争论引发的关于长尾…...

计算机技术产生的就业辩论,计算机与软件技术系辩论赛决赛
原标题:计算机与软件技术系辩论赛决赛辩论赛决赛经过激烈的交锋,终于到了万众期待的决赛阶段!11月5日于软件C101中午12:30举办了计算机与软件技术系辩论赛决赛。此次比赛,选手们又会带给我们怎样精彩的表现呢ÿ…...

学会辩论
一、明确辩论的关键控制点 1、场景选择: 在开始辩论之前,我们得先知道,想要打赢一场辩论,必须要具有裁决权的第三方在场,也就是要找到合适的场景和裁判。 2、表演整合: 什么叫辩论?我们都认…...

辩论会写数学作业使用计算机,作业辩论赛作文600字
作业辩论赛作文600字 相关内容:篇一 人常说有一张能说会道的嘴是最重要的,做人,当然要有为自己辩护的能力。4月2日,我们六年级(3)班举行了以“小学生该不该有自己的零花钱”为主题的辩论会。整 个班级按人数平分为正方和反方,每方…...

微信小程序工具报错Uncaught TypeError: document.getElementById is not a function
打开微信小程序后,报错出现如图所示 VM145:5734 Uncaught TypeError: document.getElementById is not a function VM139:1741 Uncaught TypeError: document.querySelector is not a function VM140:2207 Uncaught TypeError: document.getElementById is not a f…...

js运行机制,设计模式及语法
JavaScript作为一门运行在浏览器上的弱类型,解释型语言。 本文将先从作用域和事件循环机制来讨论js的运行机制, 再讨论三种设计模式如何用js实现及相关应用, 接着是关于js的一些语法,主要分为逻辑,数据类型和函数&a…...

简述团队模式和团队的开发模式
团队模式和团队的开发模式是什么,它们有什么关系? 一、软件团队的模式 (1)主治医师模式:一人为主,其他人为此人服务。 (2)明星模式:主治医师模式到达极致,一…...

提示 ‘nvm‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件
到这个链接下载nvm的安装包:https://github.com/coreybutler/nvm-windows/releases 安装nvm遇到的坑 1.在cmd里打开提示 【‘nvm’ 不是内部或外部命令,也不是可运行的程序 或批处理文件。】 原因: 权限不足:用管理员权限打开cm…...

Vision Pro 自己写的一些自定义工具(c#)
目录前言一、保存图片工具1、展示2、源码下载地址二、所有工具汇总下载地址前言 自己用c#写的一些visionPro自定义工具,便于使用的时候直接拿出来,后续会不断添加新的工具。 想看怎么使用c#写visionPro自定义工具,可以看下我之前写的文章&a…...

《扬帆优配》机构动向 机构坚定看好芯片股后市
业内人士以为,因为职业存在回转预期,后续又有新资金入场预期,假如上市公司的业绩可以佐证职业开展前景,芯片板块的行情有望向纵深演绎 近期商场走出分解行情,新能源板块继续下行,国企龙头股以及ChatGPT概念…...

禅道——图文安装及使用教程
👨💻作者简介:练习时长两年半的java博主 📖个人主页:君临๑ 🎞️文章介绍:禅道的2023版安装图文教程 🎁 如果文章对你有用,就点个免费的赞吧👍 目录 一、搜…...

wsl安装ros
我是在 WSL 的 Ubuntu 18.04 LTS 上安装 ROS。 准备工作 换源 我这是Ubuntu 18.04 LTS的清华源,如果需要其他版本的源,去清华软件镜像站自己寻找。 sudo nano /etc/apt/sources.list#把里面的内容删光,换成清华的源 deb https://mirrors.t…...

SEAL链路预测代码函数功能
utilis.py parse_arguments()load_ogb_dataset(dataset) ogb:神经网络基准数据集库 返回:一张图,划分好的边(测试,训练,验证)drnl_node_labeling(subgraph, src, dst) 双半径节点标记法&#x…...

spring事务失效八大场景-第十章
系列文章目录 第一章 ArrayList-Java八股面试(一) 第二章 HashMap-Java八股面试(二) 第三章 单例模式-Java八股面试(三) 第四章 线程池和Volatile关键字-Java八股面试(四) 第五章 ConcurrentHashMap-Java八股面试(五) 第六章 spring之refresh流程-Java八股面试(六) 第七…...

React 面向组件编程(上)
目录前言:一、组件的基本理解和使用1. 函数式组件2. 类式组件3. 注意事项4. 渲染函数式组件标签的基本流程5. 渲染类组件标签的基本流程二、组件三大核心属性 1:state1. 代码示例2. 效果展示3. 注意4. 设置状态:setState三、 组件三大核心属性 2…...

【多线程】CAS
✨个人主页:bit me👇 ✨当前专栏:Java EE初阶👇 目 录🐍一. 什么是 CAS🦎二. CAS 是怎么实现的🦖三. CAS 典型应用场景🐶1. 实现原子类🐱2. 实现自旋锁🦕四. …...

Geoserver 发布wmts服务,以及cesium加载发布的wmts服务
WMTS提供了一种采用预定义图块方法发布数字地图服务的标准化解决方案。WMTS弥补了WMS不能提供分块地图的不足。WMS针对提供可定制地图的服务,是一个动态数据或用户定制地图(需结合SLD标准)的理想解决办法。WMTS牺牲了提供定制地图的灵活性&am…...

第一章:auto.js开发环境搭建
相关学习文档:http://doc.autoxjs.com 一、下载并安装 Visual Studio Code 下载地址:https://code.visualstudio.com/ 二、安装 auto.js 插件 启动 Visual Studio Code按住 ctrlshift x输入Auto.js-Autox.js-VSCodeExt点击安装即可 三、启动 auto.…...

django 前后台交互
[rootcentos6 cmdb]# cat index.html <head> <title>运维平台</title> </head> <body> <include file"Public:header"/> <div class"content"> <include file"Public:menu"/> <div class&…...

接触过的第一台电脑-90年代的x86与如今的树莓派
最早接触电脑是在幼儿园,那时候电脑下象棋都要输入命令行的。后来小学时候有了电脑课,要穿鞋套的。满满的回忆。那个时代电子产品更新很慢的,一台电脑可以用5年,286-386-486-586。486电脑的特点是:处理器:使…...

ClickHouse学习笔记(二):ClickHouse常见表引擎简介
文章目录1、简述2、MergeTree 系列引擎(重要,后面单说)3、外部存储类型引擎3.1、HDFS 表引擎3.2、MySQL 表引擎3.3、JDBC 表引擎3.4、Kafka 表引擎3.5、File 表引擎4、内存类型引擎4.1、Memory 表引擎4.2、Set 表引擎4.3、Join 表引擎4.4、Bu…...

通过 Amazon Managed Microsoft Active Directory 运行混合 Active Directory 服务
企业客户通常需要构建混合 Active Directory 解决方案,以支持在现有本地企业数据中心和 Amazon Cloud 中运行的应用程序。这样做的理由有很多,例如,保持与本地旧版应用程序的集成、保持对基础设施资源的控制以及满足特定的行业合规性要求。为…...

Centos8 yum方式安装Redis
Centos8 yum方式安装Redis 是否安装GCC依赖 ggc -v #或者 rpm -q gcc安装GCC yum install -y gcc如果不是管理员 加 sudo sudo yum install -y gcc yum安装Redis yum install redis失败更新yum 再安装 #添加EPEL仓库 sudo yum install epel-release#更新yum源 sudo yum update是…...

思考:数字卫星可视化如何实现?
01.背景 随着信息化时代的到来,全球范围内的通信和数据传输需求急剧增加,传统的有线通信和数据传输方式已无法满足大范围、远距离的通信和数据传输需求,卫星通信和数据传输技术应运而生。实体卫星的发射和运行成本非常昂贵,需要经…...

【整理八】
1、说说你对Event Loop的理解? Eventloop 是一种在编程语言中常用的编程模型,用于处理任务队列中的事件,它可以被用来处理各种任务,包括网络事件、文件读写、定时器、用户界面事件等Eventloop 的工作原理是,它会按顺序处理在任务…...

SQLMAP工具基础使用
本文用的是kali自带的sqlmap工具 我们通过常用命令来理解sqlmap的基本使用 目录 检测注入 获取敏感信息 获取表 获取表的字段 获取数据 --technique 使用指定的注入方式 使用基于时间的延时注入 支持多种注入检测 默认是全部 注入时使用随机的 HTTP User-Agent 设置超时时间 读…...

【分布式】分布式锁
目录一、分布式锁介绍二、基于 Redis 实现分布式锁1. 如何基于 Redis 实现一个最简易的分布式锁?2.为什么要给锁设置一个过期时间?3. 如何实现锁的优雅续期?4. 如何实现可重入锁?一、分布式锁介绍 单机多线程: 在 Jav…...

Pseudo-completeness(前中序遍历确定后序遍历)
题目链接:题目详情 - 7-16 Pseudo-completeness (pintia.cn) 样例1输入: 7 4 2 5 1 6 3 7 1 2 4 5 3 6 7样例1输出: 1 4 5 2 6 7 3 1样例2输入: 10 8 4 9 2 10 5 1 6 3 7 1 2 4 8 9 5 10 3 6 7样例2输出: 2 8 9 4…...

基于springboot+vue的地方美食分享网站
081-springboot基于vue的地方美食分享网站开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven包&am…...

【Pyhton】库
其他开发者写好的一些代码存放到库中供人使用 标准库 Python 自带的库,安装 Python 即可使用 分类: 内置函数( print 、input )内置类型( 各种数据类型的内置操作 )文本处理时间日期数学计算文件目录数…...

Linux下LED设备驱动开发(LED灯实现闪烁)
文章目录一、配置连接说明二、更新设备树(1)将led灯引脚添加到pinctrl子系统(2)设备树中添加LDE灯的设备树节点(3)编译更新设备树三、驱动开发与测试(1)编写设备驱动代码(…...

IoC 之 Spring 统一资源加载策略
《JavaPub源码》 IoC 之 Spring 统一资源加载策略 Spring 框架的核心是 IoC(Inversion of Control),它将应用程序的对象依赖关系管理和控制反转到容器中。在 Spring IoC 容器中,组件的创建和配置是通过外部配置文件(…...

如何学习docker
学习Docker可以遵循以下步骤: 了解Docker的基本概念和架构。学习Docker前,需要了解Docker的基本概念和组成部分,包括Docker镜像、Docker容器、Docker仓库、Docker网络等等,同时也需要了解Docker的整体架构和工作原理。 安装和配…...

比肩ChatGPT的国产AI:文心一言——有话说
🔗 运行环境:chatGPT,文心一言 🚩 撰写作者:左手の明天 🥇 精选专栏:《python》 🔥 推荐专栏:《算法研究》 #### 防伪水印——左手の明天 #### 💗 大家好&am…...

数据结构与算法--栈的应用:基于C++STL利用栈实现中缀表达式求值(数域限于非负整数)。
利用栈原理实现简单的中缀表达式求值的一个课程实验定义string ex;存放中缀表达式定义两个栈stack<char> op;//操作符栈stack<int> num;//操作数栈分别存放操作符和操作数核心问题一:如何分离string类型中的数字、运算符、括号?我们注意到如…...

智慧商场精准客流统计系统
随着店铺的精细化运营的深入,对各个店铺的客流进行统计,输出明确的客流统计报表,对店铺的运营及分析有较大的帮助。尤其是在连锁门店、超市、便利店等进行客流统计,能够让总部更快速的了解到各个分店的客流人数,方便店…...

工业识别手眼标定
目录 1 手眼标定的理论基础 1.1 AXXB1.2 约束条件分析 1.2.1 旋转矩阵所需的方程数量1.2.2 平移向量的约束数量2 基于平面运动的外参标定方法 2.1 传感器的旋转轴与平面法向量重合2.2 引入其它约束参考文献附录A 一、手眼标定的理论基础 1.1 AXXB 手眼标定(hand …...

基于ssm流浪动物救助及领养管理系统(文档)024
大家好✌!我是CZ淡陌。一名专注以理论为基础实战为主的技术博主,将再这里为大家分享优质的实战项目,本人在Java毕业设计领域有多年的经验,陆续会更新更多优质的Java实战项目,希望你能有所收获,少走一些弯路…...

使用binlog把数据恢复到指定时间
使用场景 我们的数据库都有在凌晨3点做数据全备份,假如我们的数据库在上午10点出了故障,那我们就可以用备份把数据还原到凌晨3点时的状态,但是3点到10点间的数据变动是没有的,如果要将数据库恢复到故障点之前,那么需要…...

华清远见重庆中心—后端基础阶段技术总结/Java高级/个人总结
目录String字符串String类使用时注意总结字符串String类中的常用方法可变字符串StringBuilderStringBuffer构造方法常用方法注意System类常用方法和属性Runtime类特点Date类构造方法常用方法SimpleDateFormat类构造方法日期模板常用方法包装类特点异常异常的产生异常的分类Exce…...

Android Kotlin协程之Channel的使用
Channel提供了一种便捷的方法使单个值在多个协程之间进行相互传输。 通道提供了一种在流中传输值的方法。 简单说就是Channel用于多个协程之间的通信,让协程之间的协作更加的顺畅。 主要内容: 一、通道基本使用二、通道的容量三、迭代Channel四、prod…...

在 AI 上训练 AI:ChatGPT 上训练另一种机器学习模型
ChatGPT 可以像 Linux 终端一样运行,并在给出以下提示时返回执行结果。下面我来带大家操作起来。 文章目录终端操作训练机器学习模型镜像演示终端操作 输入:I want you to act as a Linux terminal. I will type commands and you will reply with what…...

Docker之路(8.Docker网络、Docker0)
理解 Docker0 1.首先使用 ip addr 查看 lo: 是我们本机的回环地址eth0: 是我们系统的内网地址,例如我的就是阿里云内网地址docker0: 安装docker后 docker0 的地址 2. docker 是如何处理容器网络访问的? 2.1 先运行一个tomcat容器来测试 docker run…...

【Unity】创建一个自己的AR安卓程序
目录1 环境配置2 下载官方提供的AR Starter工程3 AR Starter工程中的包以及打包设置3.1 Package Manager3.2 Player Settings4 创建一个新的AR场景5 AR场景中的物体6 在unity中运行AR场景7 在AR场景的基础上添加自己的想法7.1 修改Cube的旋转速度/方向7.2 将Cube替换为其他物体…...

sensor 噪声
目录 改善信噪比SNR: 随机噪声: 空间噪声(模式噪声 pattern noise,非均匀噪声non-uniformity noise) 噪声来源: 在sensor层次改善噪声: 内容为学习记录,大部分从网上摘抄的。 …...

Linux下,几个关于容量获取命令
序言:Linux下存在很多命令,其中也存在很多获取容量的命令开发应用的经常会碰到一些需求,例如:1. 获取下当前设备存储空间,例如,总大小多少,剩余大小多少之类类似,还有检测U盘&#x…...

计算机常见的进制和单位
1. 十进制 - 进制说明:以 10 为基数的进制。 - 应用场景:常见的计数方式,如人民币金额、年龄等。 - 中文表达:十进制。 2. 二进制 - 进制说明:以 2 为基数的进制。 - 应用场景:计算机内部使用的基本计数…...

【AI工具大全】不应该只知道ChatGPT
AI工具导航:AI导航 | 深度导航 ChatGPT网址导航:GitHub - LangLangShanDeNanKe/chatgpt: ChatGPT网址导航,分享免费好用AI网站! 最大的AI工具目录:Futurepedia - The Largest AI Tools Directory | Home 生成图片或…...

ICG-PEG-CRGD-吲哚菁绿-聚乙二醇-环肽;ICG可用于肝脏手术的肝段及半肝染色显影、肿瘤边界界定及肝断面胆漏侦测等方面。
ICG-PEG-CRGD-吲哚菁绿-聚乙二醇-环肽 中文名称:-吲哚菁绿-聚乙二醇-环肽 英文名称:ICG-PEG-CRGD 性状:绿色粉末 溶剂:二氯甲烷等常规性溶剂 稳定性:冷冻保存 分子量:1000、2000、3400、5000等&#…...

Go 设计模式中工厂方法模式应用
工厂方法模式(Factory Method Pattern)是一种常见的设计模式,它属于创建型模式。在 Go 语言中,工厂方法模式经常被用于对象的创建和初始化。 在工厂方法模式中,我们定义一个抽象的工厂接口,用于创建一系列…...

机器学习中的五种回归模型及其优缺点
线性回归 回归是在建模过程中用于分析变量之间的关系、以及变量是如何影响结果的一种技术。线性回归是指全部由线性变量组成的回归模型 线性回归的几个特点: 1. 建模速度快,不需要很复杂的计算,在数据量大的情况下依然运行速度很快。 2. 可以…...

verilog的经典电路详解
经典的电路的控制 例如 :spi 控制器 文档 design spec (1) IO postlist (2) feature list (3) 框图:对其进行分解,分隔 ,查看每个模块接口都有那些信息 设计人员 : 对自己的代码心里有数 全加器 提供进位输出&#x…...

神经网络之反向传播算法(加入Nesterov动量的误差反向传播算法)
文章目录1、Nesterov动量2、结合Nesterov动量的误差反向传播算法3、算法实现3.1 训练过程3.2 测试过程4、参考源码及数据集1、Nesterov动量 在动量法提出不久之后,Nesterov动量也随之被提了出来,此方法属于动量法的进一步发展,与动量法不同的…...

在Ubuntu上使用VSCode编译MySQL Connector/C连接库
首先下载并解压MySQL Connector/C源码,然后执行以下步骤: 1、安装MySQL Connector/C依赖:在终端中输入以下命令来安装MySQL Connector/C的依赖项: sudo apt-get install build-essential cmake 2、下载并解压MySQL Connector/C源…...

LeetCode 2395 - 和相等的子数组
给你一个下标从 0 开始的整数数组 nums ,判断是否存在 两个 长度为 2 的子数组且它们的 和 相等。注意,这两个子数组起始位置的下标必须 不相同 。 如果这样的子数组存在,请返回 true,否则返回 false 。 子数组 是一个数组中一段…...

游戏平台商店化的功能特点
帮助用户高效的获取游戏以及游戏相关内容是游戏平台的核心,基于这个需求在平台功能的设计上与其他类型产品也有着类似的思路。商店模式的特点诸如百货商店、超市、书店以及其他类型的商店,都会根据推荐、分类两个特点提供商品。 如果把游戏比作书籍&…...

多线程进阶学习08------CAS与原子类详解
CAS CAS介绍 CAS的全称是:比较并交换(Compare And Swap)。在CAS中,有这样三个值: V:变量var,也即AtomicInteger类当中被声明为volatile 的valueE:期望值(expected)U:新…...

牛刀小试(牛客小题)
今天为大家带来了几道牛客网的题 很简单 注重基础BC105 矩阵相等判定描述KiKi得到了两个n行m列的矩阵,他想知道两个矩阵是否相等,请你回答他。(当两个矩阵对应数组元素都相等时两个矩阵相等)。输入描述:第一行包含两个整数n和m,表…...

开启新航路,拓尔思发力AIGC市场 | 爱分析调研
2022年,随着AI聊天机器人GhatGPT在世界范围内持续火爆,极具创意、表现力、个性化且能快速迭代的AIGC技术成功破圈,成为全民讨论热点。 AIGC是指在确定主题下,由算法模型自动生成内容,包括单模态内容如文本、图像、音频…...

彻底关闭Windows更新
一、关闭Windows Update服务 1、按“Windows R”键,打开运行对话框,并输入“services.msc”,然后再单击“确定”。 2、在弹出的服务窗口中,找到“Windows Update”选项并双击打开它。 3、在弹出的“Windows Update的属性”对话框…...

Array.from() 超全用法详解
Array.from方法用于将两类对象转为真正的数组:类似数组的对象(array-like object)和可遍历(iterable)的对象(包括 ES6 新增的数据结构 Set 和 Map)。 下面是一个类似数组的对象,Arr…...

IP编辑框(官方、网上、自定义)——QtWidget
前言 最近小工具界面上用到了ip编辑框,目前是直接放了个编辑框QLineEdit,因为属于自用,就不用写诸多限制。但是时间上有多余,就用官方的(即在QLineEdit基础上直接设置的)、网上的(QLineEdit拼接…...

【Note8】
#!/bin/bash # # Copyright 2019-present Huaqin. All Rights Reserved. # # This program file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by the # Free Software Foundation; versio...

ELK企业级日志分析平台(二)
文章目录一、kibana数据可视化1.部署2.定制数据可视化(1)网站访问量(2)访问量排行榜(3)创建dashboard,大屏展示二、ES集群监控1.启用xpack认证2.metricbeat监控3.filebeat日志采集一、kibana数据…...

金三最冷春招?你工作找的怎么样?
今年3月,说它是史上“最冷春招”也不为过,不少朋友都反馈说自己投的简历石沉大海,这些似乎都证明了一件事:今年找工作真的难! 破局最重要的一点是:不断提升个人价值。 一个人在职场里、在专业领域、在技术…...

C# 连接Oracle数据库和读取数据
一直没有Oracle数据库使用的经验,现在项目对接需要使用Oracle数据库,正好花点时间来学习学习,学点皮毛然后使用用在项目上就好了。 前面的文章对Oracle数据库的安装,以及Navicat for Oracle可视化工具安装、数据库视图/表的创建进…...

面试准备啊
fail fast 是把数组原来的更改次数记住 每次都去比较 变了 就抛异常 如果数组容量没到64 会先扩容 再树化 缺点:全是偶数 hash分布不均匀 质数比较好(二次哈希也不需要) 效率好 2的n次幂 使用内存屏障解决指令重排序 第一次扩容和之后的不…...