Linux的进程编程-之二-进程间通信(信号)
1 Linux进程间通信
linux下的IPC基本上是从Unix上的IPC继承而来的。而Unix的两大主力AT&T的Bell Lab及BSD在IPC方面的侧重点有所不同。AT&T对Unix早期的进程间通信手段进行了系统的改进和扩充,形成了“system V IPC”,通信进程局限在单个计算机内;BSD则跳过了该限制,形成了基于套接口(socket)的进程间通信机制。Linux则把两者继承了下来,如图示:
最初Unix IPC包括 :信号、管道
System V IPC包括 :System V消息队列、System V信号灯、SystemV共享内存区
Posix IPC包括 :Posix消息队列、Posix信号灯、Posix共享内存区
由于Unix版本的多样性,IEEE开发了一个独立的Unix标准,称为计算机环境的可移植性操作系统界面(PSOIX)。现有大部分Unix版本都遵循POSIX标准,而Linux从一开始就遵循POSIX标准。linux下进程间通信的几种主要手段:信号、信号灯、管道、消息队列、共享内存、套接口。
1.1 信号-Signal
信号是在软件层次上对中断机制的一种模拟,进程收到一个信号等同于处理器收到一个中断。信号是异步的,一个进程不必等待信号的到达,事实上,进程也不知道信号什么时候到达。
下面的情况可以产生signal:
1.硬件中断,如除0(SIGFPE),非法内存访问(SIGSEV);
2.软件中断,如alarm超时(SIGALRM),读进程终止之后又向管道写数据(SIGPIPE);
1.按下特殊的组合键,例如CTRL+C(SIGINT),CTRL+Z(SIGTSTP);
3.kill函数可以对进程发送signal;
4.kill命令,实际上是对kill函数的一个封装实现;
进程可以通过三种方式来响应一个信号:
1.忽略signal。大部分signal都可以被ignore,除了SIGKILL和SIGSTOP。
2.捕捉signal。内核调用我们定义的信号处理函数,SIGKILL和SIGSTOP无法被捕捉。
3.执行缺省行为。
部分signal的缺省行为不仅终止进程,同时还会产生core dump,也就是生成一个名为core的文件,其中保存了退出时进程内存的镜像,可以用来调试。但是在下面情况,不会生成core文件:
1.当前进程不属于当前user;
2.当前进程不属于当前group;
3.用户在当前目录下无写权限;
4.core文件已存在,用户无写权限;
5.文件大小超出限制。
信号的种类:
非实时(不可靠)信号:可能丢失,不支持排队(pending);小于SIGRTMIN的信号。
实时(可靠)信号:支持排队(pending),不会丢失;SIGRTMIN和SIGRTMAX之间的信号。
信号名 |
值 |
|
信号含义 |
SIGHUP |
1 |
T |
1、终端关闭时,SIGHUP信号会被发送到session leader以及作为job提交的进程(即用&提交的进程); 2、session leader退出时,SIGHUP信号会被发送到session中前台进程组中的每一个进程; 3、若进程退出导致进程组成为孤儿进程组,且进程组中有进程处于停止状态(收到SIGSTOP或SIGTSTP信号),SIGHUP信号和SIGCONT信号会被发送到该进程组中的每一个进程。 孤儿进程组定义为:该进程组中每个成员的父进程或者是本组的一个成员,或者是属于其它session的成员。 |
SIGINT |
2 |
T |
程序终止信号,在用户键入INTR字符(Ctrl-C)时发出,用于通知前台进程组中的所有进程,终止进程。 |
SIGQUIT |
3 |
D |
程序终止信号,在用户键入QUIT字符(Ctrl-\)时发出,用于通知前台进程组中的所有进程,终止进程。与SIGINT不同的时,进程收到SIGQUIT终止时会产生core文件。 |
SIGILL |
4 |
D |
执行了非法指令,通常是因为可执行文件本身出现错误,或者试图执行数据段,堆栈溢出时也有可能产生这个信号。 |
SIGTRAP |
5 |
D |
SIGTRAP is the signal thrown by process when a condition arises that a debugger has requested to be informed of. |
SIGABRT |
6 |
D |
调用abort( )函数产生的信号。 |
SIGIOT |
6 |
D |
与SIGABRT同义 |
SIGBUS |
7,10,10 |
D |
非法地址,包括内存地址对齐(alignment)出错。 |
SIGFPE |
8 |
D |
发生致命算术运算错误时发出,包括浮点运算错误,溢出及除数为0等所有的算术运算错误。 |
SIGKILL |
9 |
TEF |
立即结束进程。 |
SIGUSR1 |
10,30,16 |
T |
留给用户使用。 |
SIGSEGV |
11 |
D |
试图访问未分配给自己的内存,或者试图往没有写权限的内存地址写数据。 |
SIGUSR2 |
12,31,17 |
T |
留给用户使用。 |
SIGPIPE |
13 |
T |
管道破裂,通常在进程间通信时产生。比如采用FIFO(管道)通信的两个进程,读管道没打开或者已经终止就往管道写,写进程就会收到SIGPIPE信号;此外用socket通信SOCT_STREAM的两个进程,如果读进程已经终止,写进程在写socket的时候就会收到SIGPIPE信号。 |
SIGALRM |
14 |
T |
当alarm( )函数设置间隔时间超时或setitimer( )函数设置的interval timer超时,产生此信号。 |
SIGTERM |
15 |
T |
进程结束信号,与SIGKILL不同的是该信号可以被阻塞和处理。 |
SIGSTKFLT |
16,-,- |
T |
SIGSTKFLT is the signal sent to process when the coprocessor experiences a stack fault. |
SIGCHLD |
17,20,18 |
I |
子进程结束时, 父进程会收到这个信号。 |
SIGCONT |
18,19,25 |
C |
让一个停止(stopped)的进程继续执行。 |
SIGSTOP |
19,17,23 |
SEF |
停止(stopped)进程的执行。 |
SIGTSTP |
20,18,24 |
S |
停止(stopped)进程的执行,键入SUSP字符(Ctrl-Z)时发出这个信号,用于通知前台进程组中的所有进程。 |
SIGTTIN |
21,21,26 |
S |
当一个后台进程组中的进程试图读其控制终端时,终端驱动程序产生此信号。在下列例外情形下,不产生此信号,此时读操作出错返回,errno设置为EIO:(a)读进程忽略或阻塞此信号,(b)读进程所属的进程组是孤儿进程组。 |
SIGTTOU |
22,22,27 |
S |
当一个后台进程组中的进程试图写其控制终端时产生此信号。与SIGTTIN信号不同,一个进程可以选择为允许后台进程写控制终端。如果不允许后台进程写,在下列例外情形下,不产生此信号,写操作出错返回,errno设置为EIO:(a)写进程忽略或阻塞此信号,(b)写进程所属的进程组是孤儿进程组。 |
SIGURG |
23,16,21 |
I |
有紧急数据或out-of-band数据到达socket时产生SIGURG信号。 |
SIGXCPU |
24,24,30 |
D |
超过CPU时间资源限制,可由getrlimit/setrlimit来读取/改变。 |
SIGXFSZ |
25,25,31 |
D |
进程企图扩大文件,以至于超过文件大小资源限制。 |
SIGVTALRM |
26,26,28 |
T |
当setitimer( )函数设置的虚拟间隔时间(virtual interval timer)超时,产生此信号。 |
SIGPROF |
27,27,29 |
T |
当setitimer( )函数设置的梗概统计间隔时间(profiling interval timer)超过时,产生此信号。 |
SIGWINCH |
28,28,20 |
I |
窗口大小改变时发出。窗口的大小可以用ioctl( )函数得到或设置窗口的大小。如果一个进程用ioctl( )更改了窗口大小,则系统核将SIGWINCH信号送至前台进程组。 |
SIGIO |
29,23,22 |
I/T |
文件描述符准备就绪,可以开始进行输入/输出操作。对SIGIO的系统默认动作是终止或忽略,这依赖于不同版本的系统。 |
SIGPOLL |
29,-,- |
I/T |
与SIGIO同义。 |
SIGPWR |
30,29,19 |
T |
电源失效/重启动。 |
SIGSYS |
31,12,12 |
D |
非法的系统调用。由于某种未知原因,进程执行了一条系统调用指令,但其参数却是无效的。 |
SIGINFO |
-,29,- |
T |
键入STATUS字符(CTRL+T)时发出这个信号,发送给前台进程组中的所有进程。 |
-表示信号没有实现,第一个值对应i386,中间的值对应Alpha和Sparc,最后一个值对应MIPS。
T 终止进程
I 忽略信号
D 终止进程并进行内核映像转储(dump core)
S 停止进程
C 继续进程
E 信号不能被捕获
F 信号不能被忽略
内核映像转储是指将进程数据在内存的映像和进程在内核结构中存储的部分内容以一定格式转储到文件系统,并且进程退出执行,这样做的好处是为程序员提供了方便,使得他们可以得到进程当时执行时的数据值,允许他们确定转储的原因,并且可以调试他们的程序。
1.1.1 可被信号中断的系统调用
进程在系统调用阻赛的时候,可能会被一个signal中断,此时系统调用将会返回错误并且errno被设置为EINTR。为了处理这个问题,对于这些系统调用需要作额外的检查和判断,如果错误返回并且errno=EINTR,需要重新调用。
Free BSD 4.2对于部分系统调用ioctl(),read( ),readv( ),write( ),writev( ),wait( )实现了自动恢复功能,也就是说当系统调用被中断的时候会自动恢复到原来的执行情况,Linux 2.4.22支持此功能,但POSIX.1不作强制要求。
1.1.2 信号的生命周期
对于一个完整的信号生命周期(从信号发送到相应的信号处理函数执行完毕)来说,可以分为三个阶段,这三个阶段由四个重要事件来刻画:信号诞生;信号在进程中注册完毕;信号在进程中的注销完毕;信号处理函数执行完毕。相邻两个事件的时间间隔构成信号生命周期的一个阶段。
1.信号诞生。信号诞生指的是触发信号的事件发生,如检测到硬件异常、定时器超时以及调用信号发送函数kill( )或sigqueue( )等。
2.信号在目标进程中注册。信号在进程中注册指的就是信号值加入到进程的pending信号集中。只要信号在进程的pending信号集中,表明进程已经知道这些信号的存在,只是还没来得及处理,或者该信号被进程阻塞。
注意:当一个实时信号发送给一个进程时,不管该信号是否已经在进程中注册,都会被再注册一次,因此,实时信号不会丢失,又叫做可靠信号;当一个非实时信号发送给一个进程时,如果该信号已经在进程中注册,则该信号将被丢弃,造成信号丢失。因此,非实时信号又叫做不可靠信号。
3.信号在进程中的注销。在目标进程执行过程中,会检测是否有信号等待处理。如果存在pending信号并且该信号没有被进程阻塞,则在运行相应的信号处理函数前,首先要把信号在进程中注销。注销的意思就是把信号从pending信号集中删除。
注意:在信号注销到相应的信号处理函数执行完毕这段时间内,如果进程又收到相同的信号,同样会在进程中注册。
4.信号生命终止。进程注销信号后,立即执行相应的信号处理函数,执行完毕后,信号的本次发送对进程的影响彻底结束。
1.1.3 信号的安装
linux主要有两个函数实现信号的安装:signal( )、sigaction( )。
signal( )不支持信号传递信息,主要用来安装不可靠信号;
sigaction( )支持信号传递信息,主要用来安装可靠信号,并与sigqueue( )配合使用;
sigaction( )同样可以用来安装不可靠信号的。
1.1.3.1 signal( )
#include<signal.h>
void ( *signal( int signum, void (*handler)(int) ) )(int);
typedef void (*SIGHandler)(int)
SIGHandler signal(int signum, SIGHandler handler )
参数signum:信号值。
参数handler:信号处理函数,也可以忽略信号(SIG_IGN)或执行缺省操作(SIG_DFL)。
安装成功:返回上次调用signal( )安装信号时的handler。
安装失败:返回SIG_ERR。
如果用exec( )创建子进程,那么子进程的所有signal状态是缺省或者忽略:
1.如果父进程忽略了某个signal,那么父进程用exec创建子进程时子进程的这个signal的状态也是忽略;
2.如果父进程为某个signal注册了处理函数,那么子进程中该signal的状态会恢复成缺省状态,这是因为注册的函数地址在另外一个进程中无法被调用。
如果用fork( )创建子进程,那么子进程会继承所有父进程的signal状态。
1.1.3.2 sigaction( )
#include<signal.h>
intsigaction( int signum, const struct sigaction *newAct, struct sigaction *oldAct)
typedef void (*SIGHandler)(int)
typedef void (*SIGAction)(int, struct siginfo_t *,void * )
成功返回0,失败返回-1。
struct sigaction
{
sigset_t sa_mask;
ulong sa_flags;
// sa_handler或sa_sigaction指定信号处理函数,二者使用一个即可
SIGHandler sa_handler;
SIGAction sa_sigaction;
}
1.sa_mask:当信号处理函数被调用的时候,自动block这些signal。当信号处理函数返回时,mask会恢复到原来的值。同时,内核会自动把该signal加到mask中,防止重入。
2.sa_flags用来改变信号处理的方式:
SA_SIGINFO :打开随信号一起传递来的信息
SA_NODEFER :在信号处理函数的执行过程中,不会自动阻塞当前信号。
SA_INTERRUPT :被信号中断的系统调用不会自动重启。
SA_RESTART :默认情况下,可中断的系统调用在执行过程中收到信号,就会失败退出,并将errno设为EINTR;可以使被信号中断的系统调用在信号处理函数执行完成之后重新启动执行。
SA_RESETHAND :完成信号处理函数之后,恢复默认的信号处理SIG_DFL,并会清除SA_SIGINFO,而且在信号处理函数的执行过程中,不会阻塞当前信号,就好像同时设置了SA_NODEFER。
SA_NOCLDWAIT :在目标信号是SIGCHLD时使用,声明父进程对子进程的结束不感兴趣,可以阻止子进程成为僵尸进程。如果未设置该标志,而且也没有显式地设置SIGCHLD的处理方式为SIG_IGN,则在父进程调用wait( )之前结束的子进程都会成为僵尸进程;如果设置了该标志,不管有没有显式地设置SIGCHLD的处理方式为SIG_IGN,子进程结束之后都不会成为僵尸进程。而且,如果父进程在设置完该标志位之后,调用wait( ),则父进程将被阻塞,直到所有子进程全部结束,最后返回-1。
struct siginfo_t
{
int si_signo; // 信号值
int si_errno; // 信号产生的原因
int si_code; // 信号产生的方式
union // 联合数据结构,适应不同信号
{
int mem[MEM_SIZE]; // 确保分配足够大的空间,每个信号的数据结构都能放的下
struct // 对信号1有意义的结构
{ … }
…
…
struct // 对信号n有意义的结构
{ … }
}
}
si_code的取值:
SI_USER :signal was sent by kill( ) or raise( )
SI_QUEUE :signal was sent by sigqueue( )
SI_TIMER :signal was generated by expiration of a timer set bytimer_settime( )
SI_MESGQ :signal was generated by arrival of a message on anempty message queue
SI_ASYNCIO:signal wasgenerated by completion of an asynchronous I/O request
siginfo_t结构中的联合数据结构确保适应所有的信号,比如对于实时信号而言,实际采用下面的结构形式:
struct siginfo_t
{
int si_signo;
int si_errno;
int si_code;
sigvalsi_value;
};
si_value同样为一个联合数据结构:
union sigval
{
int sival_int;
void * sival_ptr;
}
1.1.4 信号的发送
1.1.4.1 kill( )
#include<sys/types.h>
#include<signal.h>
intkill( pid_t pid, int signum )
成功返回0,失败返回-1。
参数pid指定接收信号的进程:
pid > 0 :进程ID为pid的进程
pid = 0 :同一个进程组的所有进程
pid = -1 :除发送进程自身外,所有进程ID>1的进程
pid < -1 :进程组ID为abs(pid)的所有进程
当参数sinnum为0时,不发送任何信号,可用于检查目标进程是否存在,以及当前进程是否具有向目标进程发送信号的权限。
1.1.4.2 raise( )
#include<signal.h>
intraise( int signum )
向进程本身发送信号。
成功返回0,失败返回非0值。
1.1.4.3 abort( )
#include<stdlib.h>
voidabort( void )
等价于raise( SIGABRT )。
1.1.4.4 sigqueue( )
#include<sys/types.h>
#include<signal.h>
intsigqueue( pid_t pid, int signum, const union sigval val )
成功返回0,失败返回-1。
参数val指定随信号一起传递的信息,如下图所示:
1.1.4.5 alarm( )
#include<unistd.h>
unsignedint alarm( unsigned int seconds )
设置一个timer,到指定时间(秒)之后会expire,发送一个SIGALRM给本进程。如果调用alarm( )前,进程中已经设置了alarm,则返回前一个alarm的剩余时间(秒),否则返回0。
SIGALRM的缺省行为是中止进程。同一个进程只能有一个alarm。调用alarm函数会取消前一个alarm。如果seconds设为0,则只是取消前一个alarm。
1.1.4.6 ualarm( )
#include<unistd.h>
useconds_tualarm( useconds_t useconds, useconds_t interval );
简化版的setitimer( ),使用了ITIMER_REAL的计时方式。在指定时间(毫秒)后,向进程本身发送SIGALRM信号。参数interval指定了重复的间隔时间(毫秒)。
成功返回上次调用ualarm( )后剩余的时间(毫秒),如果之前没有调用过ualarm( )则返回0;
失败返回-1。
1.1.5 信号的等待
1.1.5.1 sigwait( )
#include<signal.h>
int sigwait( const sigset_t *set, int *signum )
挂起当前进程,直到set中的一个信号到达,并将该信号从进程的pending list中清除。
如果set中的某个信号已经pending,则立即返回,并将该信号从进程的pending list中清除。
成功返回0,失败返回-1。
1.1.5.2 pause( )
#include<signal.h>
intpause( void )
挂起当前进程直到有信号被捕获,也就是说该信号:
1.有自己的信号处理函数;或者是
2.终止当前进程。
如果信号有自己的信号处理函数,则pause( )将会在信号处理函数执行完毕之后返回。
如果信号终止当前进程,则pause( )不会返回。
由于pause( )会挂起当前进程,直到某个信号中断它的执行,所以pause( )总是返回-1,并将errno设为EINTR。
1.1.5.3 sigwaitinfo( )
#include<signal.h>
intsigwaitinfo( const sigset_t *set, siginfo_t *info )
成功返回信号值,失败返回-1。
1.1.5.4 sigtimedwait( )
#include<signal.h>
#include<time.h>
intsigtimedwait( const sigset_t *set, siginfo_t *info, const struct timespec*timeout );
如果timeout为0,立即返回。
成功返回信号值,失败返回-1。
struct timespec
{
time_t tv_sec //seconds
long tv_nsec //nanoseconds
}
1.1.6 信号函数
#include<signal.h>
intsighold( int signum ); // add signal to calling process’s signalmask
intsigrelse( int signum ); // remove signal from calling process’ssignal mask
intsigignore( int signum ); // set signal disposition to SIG_IGN.
成功返回0,失败返回-1。
intsigpause( int signum ); // remove signal from calling process’s signalmask and suspend the calling process until any signal is received. Note,sigpause( ) will restore calling process’s signal mask to orginal state beforereturning.
始终返回-1。
1.1.7 信号集
#include<signal.h>
intsigfillset( sigset_t *set ) // set中将包含Linux支持的64种信号
intsigemptyset( sigset_t *set )
int sigaddset( sigset_t *set, int signum )
int sigdelset( sigset_t *set, int signum )
成功返回0,失败返回-1。
int sigismember( const sigset_t *set, int signum )
存在返回1,不存在返回0,失败返回-1。
#include <signal.h>
int sigprocmask( int how, const sigset_t *newSet,sigset_t *oldSet );
成功返回0,失败返回-1。
参数how改变当前阻塞信号的集合:
SIG_BLOCK :在当前进程的阻塞信号集中添加set中的信号。
SIG_UNBLOCK:在当前进程的阻塞信号集中删除set中的信号。
SIG_SETMASK:更新当前进程的阻塞信号集为set。
intsigpending( sigset_t *set );
成功返回0,失败返回-1。
获得已经被发送到当前进程,却被阻塞的信号。
intsigsuspend( const sigset_t *mask );
始终返回-1,errno设为EINTR。
用于在接收到某个信号之前,临时用mask替换当前进程的阻塞信号集,并将当前进程挂起,直到收到一个信号为止;在返回之前,会将进程的阻塞信号集恢复到调用之前的设置。
可以在一个原子操作内设置mask然后pause,防止在设置mask之后pause之前,信号就被发出和捕获,从而造成进程永远等待。
1.1.8 信号编程的注意事项
考虑程序的可移植性,应该尽量采用POSIX信号函数,POSIX信号函数主要分为两类:
1.POSIX1003.1信号函数:kill( )、sigaction()、sigaddset( )、sigdelset()、sigemptyset( )、sigfillset( )、sigismember()、sigpending( )、sigprocmask()、sigsuspend( )。
2.POSIX1003.1b信号函数,在信号的实时性方面对POSIX 1003.1进行了扩展,包括以下三个函数:sigqueue( )、sigtimedwait( )、sigwaitinfo( )。
考虑程序的稳定性,应该尽量在信号处理函数中使用可重入函数。满足下列条件的函数是不可重入的:
1.使用静态数据结构;
2.调用malloc()或free( )。因为当进程正在执行malloc()动态内存分配时,信号产生从而转入到信号处理函数,但是当信号处理函数中也用到了malloc( )函数时,问题就出来了。因为malloc()函数通常维护一个所有已分配内存的链表。当信号发生时,进程可能正在修改链表指针,这时在信号处理函数中将又一次修改链表。
3.调用标准I/O函数。因为大多数的标准I/O函数都使用了global全局数据结构。
即使信号处理函数使用的都是安全函数,在进入处理函数时,首先仍然要保存errno的值,结束时再恢复。这是因为在信号处理过程中,errno的值随时可能被改变。
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- L1-024 后天 (5 分)
#include<stdio.h> int main() { int a,b,c; scanf("%d",&a);if(a2>7) //当星期数溢出时 {ba2;cb%7;//进行求余运输printf("%d\n",c); }else//反之 { ca2;printf("%d\n",c); } return 0; }...
2024/4/30 16:37:48 - springCloud五大核心组件
1.springCloud五大组件运行流程 2.springcloud简单介绍 SpringCloud 是微服务架构的集大成者,将一系列优秀的组件进行了整合。基于springboot构建,对我们熟悉spring的程序员来说,上手比较容易。 通过一些简单的注解,我们就可以…...
2024/4/30 16:19:45 - python从键盘依次输入10个数,最后打印最大的数、10个数的和、和平均数。
#从键盘依次输入10个数,最后打印最大的数、10个数的和、和平均数。 llist(eval(input(10个数字用,隔开))) avgsum(l)/len(l) asum(l) vmax(l) print("最大值",v) print("平均值",avg) print("总和",a)记录练习4...
2024/4/18 17:39:38 - LeetCode0035-搜索插入
二分查找 二分查找,这题的重点主要在于范围和条件的判断 题目 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) …...
2024/4/15 9:44:16 - 定义一个含有30个整型元素的数组,按顺序分别赋予从2开始的偶数;然后按顺序每五个数求出一个平均值,放在另一个数组中并输出。试编程。
//var arr [2, 4, 6, 8, ..., 60] // 结果是一个新的数组 // [6, 16, 26, 36, 46, 56] var arr[]; var sum0; var count[]; for(i0;i<30;i){ arr.push((i1)*2); sum(i1)*2; if((i1)%50){ va…...
2024/4/23 3:49:42 - nginx 防盗链
nginx配置 location ~* \.(gif|jpg|png|jpeg) {valid_referers www.study_nginx.com;if ( $invalid_referer ) {return 403 "$request_filename";}}location ~* \.(gif|jpg|png|jpeg) {valid_referers www.nginx_cache.com;if ( $invalid_referer ) {return 403 &qu…...
2024/4/15 19:28:57 - 人工智能 --- 遗传算法解决TSP问题(JAVA版)
TSP问题,又称旅行商问题、货郎问题。 问题描述:再给定的城市地图中,要求旅行商走遍所有的城市,且每一个城市只能去一次,求该旅行商能够走遍所有城市的最短路径。 使用遗传算法解决该问题,遗传算法指通过给定…...
2024/4/29 10:48:49 - MATLAB2014b安装
1. 下载安装包 链接:https://pan.baidu.com/s/1R_qIsTd4i65HqhTY7jWBzg 提取码:c5jy 2.用虚拟光驱加载下载的ISO格式安装包 加载出来如下图 3.点击 Setup进行安装,选择使用文件安装秘钥(不需要Internet链接) 许可证…...
2024/4/15 3:12:39 - 解决安装Python后IDA中找不到Python模块的问题
IDA中以插件的方式支持Python的嵌入,所以在安装IDA时也需要安装Python。有天在一台新PC上安装完IDA和Python之后,启动IDA报找不到Python模块的问题,如下所示: 具体的提示信息为: LoadLibrary(C:\Users\Administrator\D…...
2024/4/18 17:41:39 - 动态规划习题本(持续更新)
1.求连续数组的最大和: 力扣 public static int maxSubArray(int[] nums) {//当前最大值int pre 0;int max nums[0];for (int temp : nums) {pre Math.max(pre temp, temp);max Math.max(pre, max);}return max;} 动态规划思路: 求当前f(i-1) nums[i] 和…...
2024/4/18 12:09:46 - python使用random模块,产生50~150之间的数
#使用random模块,产生50~150之间的数 import random nrandom.randint(50,150) print(n) 记录练习3...
2024/4/17 12:36:31 - 汇编-数据处理的两个基本问题
数据处理的两个基本问题 bx,si,di和bp 只有bx,si,di和bp可以放在[ ]中进行内存单元的寻址 可以单个出现和组合出现 组合的方式:bx si,bx di, bp si, bp di,bx si…...
2024/4/15 21:11:09 - 《算法很美》1.6 1.7Day3
1.6整数的奇偶位互换 public static void main(String[] args) {int a13;System.out.println(Integer.toString(a,2));int cchange(a);System.out.println(Integer.toString(c,2));}//从右往左为1private static int change(int i) {// TODO Auto-generated method stub//ji是…...
2024/4/15 19:29:07 - 这些app解决MAC电脑90%的烦恼,早晚用的到
如果平时常用Mac电脑,那么这些功能强大的实用软件不可错过呦,既然早晚用得上,不如现在就入手。 极速无死角读写工具Paragon NTFS 无论是想下载文件或是清理数据,都需要用到读写工具。普通的读写软件在部分分区只能读不能写&…...
2024/4/15 19:45:32 - LeetCode58题(最后一个单词的长度)
LeetCode 58题 最后一个单词的长度链接:https://leetcode-cn.com/problems/length-of-last-word/submissions/给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中最后一个单词的长度。单词 是指仅由字母组成、不包含…...
2024/4/15 19:29:07 - PbootCMS灵活的多层级URL地址模式配置详细教程
PbootCMS灵活的多层级URL地址模式配置教程,熟悉PbootCMS手册是使用本程序开发模板的前提,还有很多大家需要了解和调整的。 PbootCMS已经非常灵活的支持多层级URL地址模式,自定义包含如下情况: 1、栏目自定义 只需要在栏目的URL…...
2024/4/29 21:06:59 - Unity项目常见Lua解决方案性能比较
https://blog.uwa4d.com/archives/lua_perf.html...
2024/4/19 11:19:54 - C语言数据结构(3)——带哨兵结点的循环双向链表
循环双向链表(哨兵)1.基本数据类型2.新建结点3.初始化链表4.打印链表5.尾插结点6.头插结点7.尾删结点8.头删结点9.寻找链表结点,返回地址10.链表插入结点11.链表删除结点12.代码演示1.基本数据类型 typedef int LTDatatype;typedef struct LT…...
2024/4/16 2:31:27 - carsim2019.1安装遇到问题及解决方法
破解完成后打开carsim遇到的问题 解决方法 1.运行安装目录下Programs文件夹下HostID.exe,查看BIABIA409F38DF1EB7(每个人电脑上不同) 2.用 Notepad(网上下载一下)打开破解文件中生成的MSCLIC_SSQ.dat ,将其中中所有 的…...
2024/4/18 6:52:50 - 正确优雅地解决用户退出 JSP及Struts解决方案
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴! 摘要 在一个有密码保护的Web应用中,正确处理用户退出过程并不仅仅只需调用HttpSessio…...
2024/4/15 19:29:07
最新文章
- Mac好用又好看的终端iTerm2 + oh-my-zsh
Mac好用又好看的终端iTerm2 1. iTerm2的下载安装2. oh-my-zsh的安装2.1 官网安装方式2.2 国内镜像源安装方式 3. oh-my-zsh配置3.1 存放主题的路径3.2 存放插件的路径3.3 配置文件路径 1. iTerm2的下载安装 官网下载: iTerm2 2. oh-my-zsh的安装 oh-my-zsh是一…...
2024/4/30 18:57:49 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/3/20 10:50:27 - Mybatis--TypeHandler使用手册
TypeHandler使用手册 场景:想保存user时 teacher自动转String ,不想每次保存都要手动去转String;从DB查询出来时,也要自动帮我们转换成Java对象 Teacher Data public class User {private Integer id;private String name;priva…...
2024/4/30 4:21:27 - WIFI驱动移植实验:WIFI从路由器动态获取IP地址与联网
一. 简介 前面两篇文章,一篇文章实现了WIFI联网前要做的工作,另一篇文章配置了WIFI配置文件,进行了WIFI热点的连接。文章如下: WIFI驱动移植实验:WIFI 联网前的工作-CSDN博客 WIFI驱动移植实验:连接WIF…...
2024/4/30 4:29:36 - 【外汇早评】美通胀数据走低,美元调整
原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...
2024/4/29 23:16:47 - 【原油贵金属周评】原油多头拥挤,价格调整
原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...
2024/4/30 18:14:14 - 【外汇周评】靓丽非农不及疲软通胀影响
原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...
2024/4/29 2:29:43 - 【原油贵金属早评】库存继续增加,油价收跌
原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...
2024/4/30 18:21:48 - 【外汇早评】日本央行会议纪要不改日元强势
原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...
2024/4/27 17:58:04 - 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响
原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...
2024/4/27 14:22:49 - 【外汇早评】美欲与伊朗重谈协议
原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...
2024/4/28 1:28:33 - 【原油贵金属早评】波动率飙升,市场情绪动荡
原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...
2024/4/30 9:43:09 - 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试
原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...
2024/4/27 17:59:30 - 【原油贵金属早评】市场情绪继续恶化,黄金上破
原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...
2024/4/25 18:39:16 - 【外汇早评】美伊僵持,风险情绪继续升温
原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...
2024/4/28 1:34:08 - 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势
原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...
2024/4/26 19:03:37 - 氧生福地 玩美北湖(上)——为时光守候两千年
原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...
2024/4/29 20:46:55 - 氧生福地 玩美北湖(中)——永春梯田里的美与鲜
原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...
2024/4/25 18:39:14 - 氧生福地 玩美北湖(下)——奔跑吧骚年!
原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...
2024/4/26 23:04:58 - 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!
原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...
2024/4/27 23:24:42 - 「发现」铁皮石斛仙草之神奇功效用于医用面膜
原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...
2024/4/28 5:48:52 - 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者
原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...
2024/4/30 9:42:22 - 广州械字号面膜生产厂家OEM/ODM4项须知!
原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...
2024/4/30 9:43:22 - 械字号医用眼膜缓解用眼过度到底有无作用?
原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...
2024/4/30 9:42:49 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...
2022/11/19 21:17:16 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在iPhone上关闭“请勿打扰”
Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...
2022/11/19 21:16:57