《Linux C++通信架构实战》第3章
《Linux C++通信架构实战》第3章
- 终端和进程的关系
- 信号
- 基本概念
- kill
- 进程状态
- 常用信号
- 信号处理的相关动作
- UNIX/Linux体系结构
- UNIX/Linux操作系统体系结构
- signal函数
- 信号编程
- 信号集(信号屏蔽字)
- 信号相关函数
- sigprocmask等信号函数
- fork函数
- 简单认识
- 进一步认识
- 完善fork代码
- fork执行相关的逻辑判断
- fork失败的可能原因
- 守护进程
- 普通进程
- 守护进程基本概念
- 守护进程编写规则
- 守护进程不会收到的信号
- 守护进程与后台进程的区别
文件权限符"drwxrwxrwx", read®, write(w), execute(x)。
d表示目录。3组,当前用户权限,同组用户权限,其他用户权限。
目录权限,r能被浏览(ls);w能新建、删除、修改、移动目录内的文件;x进入目录权限(cd)。
终端和进程的关系
- 终端与bash进程
每个虚拟终端(pts)连到虚拟机,都会打开一个bash进程(shell壳)。输入命令黑窗就是bash(shell,命令行解释器是个可执行程序),用于解释用户输入的命令。
- 终端开启进程
ps -la
#l,长显示输出格式
#a,显示终端上的所有进程,包括其他终端上的进程
随着终端退出,该终端上运行的进程(nginx)也退出了。
init进程(操作系统启动时内核自己创建出来的,具有超级用户特权),进程ID(PID)是1。
- init进程(初始进程)
—fork➡
- getty进程(打开终端设备【文件描述符0,1,2】,读取用户和环境信息)
—exec➡
- login进程/sshd远程登录服务进程(处理登录信息:虚拟机用终端tty登录通过login进程处理,XShell登录通过/sshd远程登录服务进程处理)
—fork➡
- bash(shell)进程(执行bash进程)
—fork➡
- cp、ps、ls、rm、mkdir、vim、nginx等进程(执行各种用户命令、用户进程)
- 进程关系进一步分析
- 会话(session),进程组的集合。
- 进程组(分组方便管理,例如给整个组发消息),进程的集合。
- 进程组中各个进程,可以独立接收来自终端的各种信号。
进程ID(PID),父进程ID(PPID),进程组ID(PGRP,与进程组ID相同的进程叫进程组组长),会话ID(SID,等于会话首进程ID)。
通常一个bash(shell)上所有进程都属于同一个会话。
会话首进程(session leader,创建会话的进程),通常是这个shell(bash)。
ps -eo pid,ppid,sid,tty,pgrp,comm | grep -E 'bash|PID|nginx'
#e,所有进程
#o,指定显示列
#sid,session id;tty,终端;pgrp,进程组;comm,执行的命令。
#-E,开启扩展正则表达式,'bash|PID|nginx'中‘|’表示或者
Xshell端口,系统会给会话首进程(这个bash进程)发送SIGHUP信号(终端断开),bash进程收到SIGHUP信号后,将这个信号发给session里的所有进程(最后发给自己),收到SIGHUP信号的进程默认动作就是退出。
- strace工具
调试分析诊断工具,跟踪程序执行时进程的系统调用(system call)和所接收到的信号。
sudo strace -e trace=signal -p 1157
#si_pid,发送信号者
#kill,发送信号
跟踪PID1157的进程上与信号(signal)有关的系统调用。
int abc = 4294966139;
等价于
int abc = -1157;
kill -1157表示给进程组1157发送信号。
- 终端关闭时不退出进程
(1)拦截SIGHUP信号
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
int main(int argc, char *const *argv) {signal(SIGHUP, SIG_IGN);//忽略SIGUP信号while(1) {sleep(1);}return 0;
}
终端断开后,该进程TT变为?,PPID变为1。
(2)进程和终端bash进程在不同session
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
int main(int argc, char *const *argv) {setsid();while(1) {sleep(1);}return 0;
}
进程组组长调用setsid()无效。
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
int main(int argc, char *const *argv) {pid_t pid = fork();if(pid<0){printf("error\n");} else if(pid==0) { //子进程setsid();//子进程调用setsid()有效,TT变为?。while(1) {printf("child thread\n");//注意即使TT为?,当前终端(关联终端)仍会输出sleep(1);}} else {//父进程//setsid();//父进程,进程组组长,调用setsid()无效。while(1) {printf("parent thread\n");sleep(1);}}return 0;
}
关闭当前终端后,父进程退出,子进程仍运行,变成孤儿进程。
(3)setsid命令启动进程
使启动的进程在新的session中,终端关闭时不会退出。
setsid ./nginx
PPID为1,TT为?。
(4)nohup(no hang up不挂断)
nohup命令启动的程序会忽略SIGHUP信号。
nohup ./nginx
nohup命令将输出重定向到当前目录的nohup.out文件中。
关闭终端后,进程PPID为1,TT为?。
- 后台执行(运行)
./nginx &
#fg,切换当前后台进程到前台
#fg jobnumber(是命令编号),选定进程
#bg jobnumber,后台暂停进程后台继续执行
#jobs,查看后台进程
#kill %jobnumber(jobs)
#kill pid(ps)
#Ctrl+C,终止前台
#Ctrl+Z,前台变后台且暂停
#nohup ./nginx &,后台运行且终端断开进程不退出
后台执行,终端能同时做其他事情;
Ctrl+C(中断键)能停止前台进程,无法终止后台进程;
终端连接断开,后台进程被关闭(退出)。
信号
基本概念
信号(突然事件,异步发生,“软件中断”),就是一个通知(事件通知),用来通知进程发生了事件。
信号产生:
- 进程发送给替他进程或自己
ngnix热升级启动新master进程时,向旧msater进程发送信号。
- 内核发送给进程
①键盘输入命令动作,Ctrl+C(中断信号);kill命令。
②内存访问异常。除数为0,硬件检测到并通知内核。
信号名,SIG开头(宏定义),数字(1开始编号),signal.h。
sudo find / -name "signal.h" | xargs grep -in "SIGHUP"
#i,忽略大小写
#n,显示行号
kill
向进程发送信号。
绝大多数信号的默认动作,是终止收到信号的进程。
kill pid(默认-15),向进程发送SIGTERM终止信号
kill -1 pid,向进程发送SIGHUP挂断信号
kill -2 pid,向进程发送SIGINT中断信号
kill参数 | 该参数发出信号 | 内核默认动作 |
---|---|---|
-1 | SIGHUP(连接断开) | 终止掉进程(进程没了) |
-2 | SIGINT(终端中断符,Ctrl+C) | 终止掉进程(进程没了) |
-3 | SIGQUIT(终端退出符,Ctrl+\) | 终止掉进程(进程没了) |
-9 | SIGHUPKILL(终止) | 终止掉进程(进程没了) |
-18 | SIGCONT(暂停进程继续) | 忽略(进程运行不受影响) |
-19 | SIGSTOP(停止),可用SIGCONT继续,但任务被放到了后台 | 停止进程(不是终止,进程还在) |
-20 | SIGSTP(终端停止符,Ctrl+Z),可用SIGCONT继续,但任务被放到了后台 | 停止进程(不是终止,进程还在) |
进程状态
ps -eo pid,ppid,sid,tty,pgrp,comm,stat | grep -E "bash|PID|nginx"
# stat,查看进程状态ps aux| grep -E "bash|PID|nginx"
进程状态 | 含义 |
---|---|
D | 不可中断的休眠状态(通常是I/O的进程),可以处理信号,有延迟 |
R | 可执行状态 & 运行状态(在运行队列里的状态) |
S | 可中断的休眠状态之中(等待某事件完成),可以处理信号 |
T | 停止或被追踪(被作业控制信号锁停止) |
Z | 僵尸进程 |
X | 死掉的进程 |
< | 高优先级进程 |
N | 低优先级进程 |
L | 有些页被锁进内存 |
s | session leader,其下有子进程 |
t | 追踪期间被调试器停止 |
+ | 位于前台的进程组 |
常用信号
信号名称 | 信号含义 |
---|---|
SIGHUP(连接断开) | 终端断开信号。Xshell断开发送,-1。 |
SIGALRM(定时器超时) | alarm创建定时器,超时产生。 |
SIGINT(中断) | Ctrl+C,终止进程。后台进程忽略。 |
SIGSEGV(无效内存) | SEGV,段违例(segmentation violation),内存访问有问题产生。 |
SIGIO(异步I/O) | 通信套接口有数据到达或发生异步错误,内核向进程通知该信号。 |
SIGCHILD(子进程改变) | 进程终止或停止,该信号发送给父进程。 |
SIGUSR1、SIGUSR2(用户定义信号) | 用于应用程序。 |
SIGTERM(终止) | kill pid产生,退出前处理工作,优雅退出。 |
SIGKILL(终止) | 不能被忽略,不能被进程本身捕捉,杀死任意进程。 |
SIGSTOP(停止) | 不能被忽略,不能被进程本身捕捉,停止执行进程。 SIGCONT信号继续执行,但会放入后台。 |
SIGQUIT(终端退出符) | Ctrl+\,shell会将后台进程对该信号的处理设置为忽略(后台进程不会收到该信号)。 |
SIGCONT(使暂停进程继续) | 继续运行暂停的进程。 |
SIGTSTP(终端停止符) | Ctrl+Z,进程被停止且放入后台,可以用SIGCONT继续执行。 |
信号处理的相关动作
- 执行系统默认动作
绝大多数情况,内核(操作系统)会杀死(终止)进程。
- 忽略此信号
signal(SIGHUP, SIG_IGN);
2个信号(特权信号)不能忽略,SIGKILL和SIGSTOP。
- 捕捉该信号
写信号处理函数,当系统收到该信号时,会自动调用信号处理函数。
2个信号(特权信号)不能被捕捉,SIGKILL和SIGSTOP。
UNIX/Linux体系结构
UNIX/Linux操作系统体系结构
-
(1)操作系统/内核——软件。用于控制计算机硬件资源,提供应用程序运行的环境。程序,要么运行在用户态,要么运行在内核态。一般情况下运行在用户态,程序执行特殊代码时,切换到内核态(操作系统控制)。
应用程序通过shell、公共函数库进行系统调用(内核的对外接口,访问磁盘,内存等资源)。
-
(2)系统调用函数库,系统内部高度封装,调用即可。
-
(3)bash(borne again shell),shell的一种,命令行解释器。位于系统调用和应用程序之间,分隔系统调用和应用程序,胶水(将系统调用和应用程序粘在一起)作用。
操作系统内核部分有进程管理(CPU)、内存管理(RAM)、文件系统(磁盘/存储设备)、设备驱动(各种终端设备)、网络(网卡)等各种资源的管理。操作系统内核和用户空间(应用程序),通过系统调用(system call)接口实现对各种资源功能的调用。
-
(4)用户态内核态之间的切换
进程大部分时间处于用户态下,需要内核提供服务才切换到内核态,内核态任务处理完成后,又切换回用户态。
分用户态,内核态的目的:
①用户态权限小,内核态权限大。权限大,能做危险事情(处理内存、处理时钟等),交由内核态处理,避免系统处于危险状态甚至崩溃,只提供调用接口。
②系统提供并统一管理调用接口。系统资源有限,避免发生访问冲突,资源耗尽等导致系统崩溃,系统接口用于减少有限资源访问和使用的冲突。
用户态切换到内核态时间:
①系统调用。malloc
②异常事件。收到信号,调用信号处理函数,系统跳到内核态做一些调用该信号处理函数的准备工作
③外围设备的中断。外围设备完成用户的请求操作后,会向CPU发出中断信号,此时CPU就会暂停执行下一条即将执行的指令,转而去执行中断信号对应的处理程序,如果先前执行的指令处于用户态下,就会发生用户态到内核态的转换。
signal函数
忽略或捕捉信号。
#include <stdio.h>
#include <unistd.h>
#include <signal.h>void sig_usr(int signo) {if(signo==SIGUSR1) {printf("SIGUSR1\n");}else if(signo==SIGUSR2) {printf("SIGUSR2\n");}else{printf("Unknown Signal: %d\n", signo);}
}int main(int argc, char *const *argv) {if(signal(SIGUSR1, sig_usr) == SIG_ERR) {printf("Catch SIGUSR1 Error\n");}if(signal(SIGUSR2, sig_usr) == SIG_ERR) {printf("Catch SIGUSR2 Error\n");}while(1) {sleep(1);printf("Sleep 1s\n");}return 0;
}
kill -USR1 pid
kill -USR2 pid
进程执行过程中,信号到来引发的用户态和内核态之间的切换过程:
- 进程nginx正常执行,突然到来信号导致nginx进程的流程被打断,进程从用户态切换到内核态(做一些调用信号处理函数的准备工作);
- 为了调用注册的信号处理函数sig_usr,又从内核态切换到用户态;
- sig_usr执行完毕后,从用户态切换到内核态(做一些信号处理函数的收尾工作);
- 从内核态切换到用户态,从之前被打断的nginx进程的执行流程处开始继续执行。
- 可重入函数
可重入的函数(或异步信号安全的函数),指在信号处理函数中调用是安全的函数。
可重入函数(即可以被中断的函数)可以被一个以上的任务调用,而不担心数据破坏。可重入函数在任何时候都可以被中断,而一段时间之后又可以恢复运行,而相应的数据不会破坏或者丢失。
信号处理函数中处理方法:
(1)尽量调用简单语句,尽量不要调用系统函数(malloc,printf等)。
(2)只调用可重入系统函数。
(3)调用了可能修改errno值的可重入系统函数,先备份errno,信号处理函数返回前恢复errno值。
#include <errno.h>void sig_usr(int signo) {int myerrno = errno;//备份errno//调用可能修改errno值的可重入系统函数errno = myerrno;//还原errno
}
- 不可重入函数的错用示例
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>void sig_usr(int signo) {if(signo==SIGUSR1) {printf("SIGUSR1\n");}else if(signo==SIGUSR2) {printf("SIGUSR2\n");}else{printf("Unknown Signal: %d\n", signo);}
}int main(int argc, char *const *argv) {if(signal(SIGUSR1, sig_usr) == SIG_ERR) {printf("Catch SIGUSR1 Error\n");}if(signal(SIGUSR2, sig_usr) == SIG_ERR) {printf("Catch SIGUSR2 Error\n");}while(1) {int *p;p = (int *)malloc(sizeof(int));sleep(1);printf("Sleep 1s\n");free(p);}printf("Over\n");return 0;
}
kill -USR1 pid
kill -USR2 pid
正常运行。
修改sig_usr。
void sig_usr(int signo) {int *p = (int *)malloc(sizeof(int)); //非可重入函数//像printf()和malloc()之类的标准库函数,它们会使用全局的数据(比如malloc()需要使用进程的堆数据结构)是不可重入的,即使加锁也无法解决,加锁可以使得库函数Tread-safe,但是无法解决可重入。//malloc并不是简单的一条指令,内部比如有加锁和开锁功能,main函数中调用malloc函数中刚加锁,然后信号处理函数中断,sig_usr调用malloc,再一次加锁,发生错误。free(p);if(signo==SIGUSR1) {printf("SIGUSR1\n");}else if(signo==SIGUSR2) {printf("SIGUSR2\n");}else{printf("Unknown Signal: %d\n", signo);}
}
信号编程
信号集(信号屏蔽字)
当收到某个信号,启动执行信号处理函数的时候,通常会“屏蔽/阻塞”其后的相同信号,直到信号处理函数执行结束。
进程会记录当前阻塞了哪些信号。收到某个信号时,系统将标记正在处理该信号的标志设置为1,然后去执行信号处理函数,若执行期间再次收到该信号,系统检测到该信号的标志已经为1,后面的相同信号就需要排队等待(等待调用信号处理函数处理)或之间被忽略(丢失)。当信号处理函数执行完毕,再把该信号对应标志设置回0。
sigset_t表示信号集数据类型。
typedef struct {unsigned long sig[2];//8*4*2个信号,来(1)或没来(0)
}sigset_t;
信号相关函数
(1)sigemptyset
所有信号清零,所有信号没来。
(2)sigfillset
所有信号设置为1,到来的任何信号都会排队或被忽略。
(3)sigaddset增加信号(设置为1),sigdelset删除信号(设置为0)
(4)sigprocmask设置进程信号集(进程有默认信号集),sigismember检测信号集特定信号是否被置位。
sigprocmask等信号函数
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>//信号处理函数
void sig_quit(int signo) {printf("SIGQUIT\n");/*//第二次收到SIGQUIT信号时,采用默认处理,即显示Quit后立即终止。if(signal(SIGQUIT, SIG_DFL) == SIG_ERR) {printf("SIGQUIT Default Handle Error!\n");exit(1);}*/
}int main(int argc, char *const *argv) {sigset_t newmask;//新信号集sigset_t oldmask;//旧信号集sigset_t pendmask;//Ctrl+\, SIGQUITif(signal(SIGQUIT, sig_quit) == SIG_ERR) { //注册信号对应的信号处理函数printf("Catch SIGQUIT Error!\n");exit(1);}//newmask信号集中所有信号清零(这些信号都没有来)sigemptyset(&newmask);//newmask信号集中SIGQUIT信号置1,再来SIGQUIT信号进程收不到sigaddset(&newmask, SIGQUIT);//设置进程信号集//SIG_BLOCK表示,newmask值为当前信号屏蔽字和newmask的并集或(屏蔽了SIGQUIT信号,只有SIGQUIT位为1)//进程当前信号屏蔽字,开始全部为0//oldmask,保存老的信号集(全部为0,无信号屏蔽),用于恢复。if(sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0) {printf("sigprocmask(SIG_BLOCK) Error!\n");exit(1);}printf("sleep 10s--begin--, cannot receive SIGQUIT!\n");sleep(10);printf("sleep 10s--end--, cannot receive SIGQUIT!\n");if(sigismember(&newmask, SIGQUIT)) {printf("SIGQUIT is shielded\n");//} else {printf("SIGQUIT is not shielded");}if(sigismember(&newmask, SIGHUP)) {printf("SIGHUP is shielded");} else {printf("SIGHUP is not shielded\n");//}//取消SIGQUIT信号的屏蔽(阻塞)——信号集还原//SIG_SETMASK表示,设置当前信号屏蔽字为oldmask(全0,无信号屏蔽)if(sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0) {printf("sigprocmask(SIG_SETMASK) Error!\n");exit(1);}printf("sigprocmask(SIG_SETMASK) Success!\n");if(sigismember(&oldmask, SIGQUIT)) {printf("SIGQUIT is shielded\n");} else {printf("SIGQUIT is not shielded, sleep 10s\n");int mysl = sleep(10);//收到信号会中断休眠,返回剩下时间if(mysl>0)printf("left %ds\n", mysl);}printf("Over\n");return 0;
}
运行进程时连续输入5个Ctrl+\(SIGQUIT),进程却只收到1个,说明信号有等待机制(信号SIGQUIT被屏蔽时发出SIGQUIT信号,后续该信号屏蔽被取消时能够收到),但无法允许多个相同的信号排队等待(5个SIGQUIT信号被合并成1个)
fork函数
简单认识
- 进程概念
多个进程可共享同一个可执行文件(程序),进程一般定义为程序执行的一个实例。fork用于进程中创建子进程,当该子进程创建时,它从fork函数的下一条语句(或者说从fork的返回处)开始执行与父进程相同的代码。fork后父子进程执行的先后顺序并不确定(与内核调度算法有关)。
- 简单范例
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>//信号处理函数
void sig_usr(int signo) {printf("Signal=%d, PID=%d\n", signo, getpid());
}int main(int argc, char *const *argv) {pid_t pid;if(signal(SIGUSR1, sig_usr) == SIG_ERR) {printf("Catch SIGUSR1 Error\n");exit(1);}pid = fork();if(pid<0) {printf("Create Process Error\n");exit(1);}//父子进程同时运行while(1) {sleep(1);printf("Sleep 1s, PID=%d\n", getpid());}printf("Over, PID=%d\n", getpid());return 0;
}
子进程被杀死(SIGKILL)后,父进程收到了SIGCHILD信号,子进程变为僵尸进程(COMMAND显示defunct(失效),STAT显示Z)
- 僵尸进程的产生和解决
子进程终止了,父进程还活着,但该父进程未调用函数(wait/waitpid)来进行额外处置(处置子进程终止这件事),子进程将变成僵尸进程(未释放资源,比如PID)。
杀掉父进程,僵尸进程会自动消失;
子进程终止或停止时,父进程会收到SIGCHILD信号,可以在信号处理函数中调用wait/waitpid函数,释放僵尸进程。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sys/wait.h>//信号处理函数
void sig_usr(int signo) {int status;switch(signo) {case SIGUSR1:printf("SIGUSR1, PID=%d\n", getpid());break;case SIGCHILD:printf("SIGCHILD, PID=%d\n", getpid());//-1,任意子进程//status,保存子进程的状态信息//WNOHANG,非阻塞pid_t pid = waitpid(-1, &status, WNOHANG);//pid==0,子进程未结束,这里不会为0,子进程结束才触发SIGCHILD信号处理函数。//pid==-1,waitpid调用有错误break;}
}int main(int argc, char *const *argv) {pid_t pid;if(signal(SIGUSR1, sig_usr) == SIG_ERR) {printf("Catch SIGUSR1 Error\n");exit(1);}if(signal(SIGCHILD, sig_usr) == SIG_ERR) {printf("Catch SIGCHILD Error\n");exit(1);}pid = fork();if(pid<0) {printf("Create Process Error\n");exit(1);}//父子进程同时运行while(1) {sleep(1);printf("Sleep 1s, PID=%d\n", getpid());}printf("Over, PID=%d\n", getpid());return 0;
}
进一步认识
fork产生的子进程和父进程共享内存空间,采用写时复制(修改内存后,复制一份内存给进程单独使用,避免相互影响),提高执行效率。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>//4个进程
int main(int argc, char *const *argv) {fork();fork();while(1) {sleep(1);printf("Sleep 1s, PID=%d\n", getpid());}printf("Over, PID=%d\n", getpid());return 0;
}
完善fork代码
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>int g_mygbltest = 0;
int main(int argc, char *const *argv) {pid_t pid = fork();if(pid<0) {printf("Create Process Error\n");exit(1);}if(pid==0) {//子进程while(1) {g_mygbltest++;sleep(1);printf("Child Process, PID=%d, g_mygbltest=%d\n", getpid(), g_mygbltest);}} else {//父进程while(1) {g_mygbltest++;sleep(1);printf("Parent Process, PID=%d, g_mygbltest=%d\n", getpid(), g_mygbltest);}}printf("Over, PID=%d\n", getpid());return 0;
}
fork执行相关的逻辑判断
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>//7个进程
int main(int argc, char *const *argv) {(fork() && fork()) || (fork() && fork());while(1) {sleep(1);printf("Sleep 1s, PID=%d\n", getpid());}printf("Over, PID=%d\n", getpid());return 0;
}
( | ( | fork() | && | fork() | ) | ) | || | ( | ( | fork() | && | fork() | ) | ) | 进程 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
①pid=0 False | ①①pid=0 False | 1 | |||||||||||||
①②pid>0 True | ①②①pid=0 False | 2 | |||||||||||||
①②②pid>0 True | 3 | ||||||||||||||
②pid>0 True | ②①pid=0 False | ②①①pid=0 False | 4 | ||||||||||||
②①②pid>0 True | ②①②①pid=0 False | 5 | |||||||||||||
②①②②pid>0 True | 6 | ||||||||||||||
②②pid>0 True | 7 |
fork失败的可能原因
- 系统中进程太多
系统PID有限,默认最大PID为32767,僵尸进程占据PID。
- 创建进程数超过当前用户允许创建的最大进程数
printf("每个用户允许创建的最大进程数=%ld\n", sysconf(_SC_CHILD_MAX));
守护进程
普通进程
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>//7个进程
int main(int argc, char *const *argv) {while(1) {sleep(1);printf("Sleep 1s, PID=%d\n", getpid());}printf("Over, PID=%d\n", getpid());return 0;
}
终端退出,进程消失。
运行进程的终端被占用,不能做其他事。
守护进程基本概念
一种长期在后台运行,不与任何控制终端关联的进程。
基本特点:
- 生存期长,一般操作系统启动时启动,操作系统关闭时关闭。
- 无关联控制终端,终端退出不会导致守护进程退出。
- 后台默默运行,不会占着终端。
ps -efj
#e,所有进程
#f,完整格式信息
#j,显示与任务或者作业有关信息
PPID为0的是内核进程,超级用户特权进程,随系统启动。
CMD列中,[]为内核守护进程,kthreadd是其他内核守护进程的父进程,PID为2。
老祖宗进程init,系统守护进程,收养孤儿进程,PID为1.
不带[]的普通守护进程(用户级守护进程):
- rsyslogd,系统消息日志有关的进程
- sshd,安全远程登录进程
守护进程的共同点:
- 大多数守护进程以超级用户特权运行(做事情需要权限)
- 没有控制终端,TTY显示?。内核守护进程以无控制终端方式启动,普通守护进程可能是守护进程调用setsid启动。
守护进程编写规则
- 调用umask(0)
umask函数,限制(屏蔽)一些文件权限。umask(0),不让它限制文件权限(守护进程可能要创建文件),并给这个文件设置一定的权限。
- fork子进程,然后退出父进程
- 命令行(shell)启动进程,父进程终止会空出终端。
- fork的子进程,能够成功调用setsid函数。
(1)文件描述符,标识文件
0,标准输入,键盘输入,STDIN_FILENO
1,标准输出,屏幕显示,STDOUT_FILENO
2,错误输出,屏幕显示,STDERR_FILENO
程序运行时,自动打开3个文件描述符。
(2)输入输出重定向
ls -la > myoutfile
cat < myoutfile
cat < myoutfile > myoutfile2
(3)空设备
“/deb/null”,黑洞设备,特殊的设备文件,丢弃(吞噬)一切写入其中的数据。
//读写方式打开黑洞设备
int fd = open("/dev/null", O_RDWR); //NULL//先关闭STDIN_FILENO(已经打开的文件描述符,改动之前先关闭)
//让STDIN_FILENO指向fd所指的内容(/dev/null)
//类似于指针指向NULL,让/dev/null成为标准输入
dup2(fd, STDIN_FILENO); //close(STDIN_FILENO), STDIN_FILENO=fd;//先关闭STDOUT_FILENO(已经打开的文件描述符,改动之前先关闭)
//让STDOUT_FILENO指向fd所指的内容(/dev/null)
//类似于指针指向NULL,让/dev/null成为标准输出
dup2(fd, STDOUT_FILENO); //close(STDOUT_FILENO), STDOUT_FILENO=fd;//通过STDIN_FILENO,STDOUT_FILENO输入输出都会被/dev/null吞噬//STDERR_FILENO未关闭if(fd>STDERR_FILENO)close(fd); //fd = null,释放资源,这个文件描述符fd可以被复用。
(4)范例
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>#include <sys/stat.h>
#include <fcntl.h>//创建守护进程
int ngx_daemon() {int fd;switch(fork()) {case -1://创建子进程失败,这里可以写日志......return -1;case 0://子进程,直接跳出break;default://父进程,直接退出exit(0);}//子进程才走到这里if(setsid() == -1) { //脱离终端,终端关闭,子进程不会退出//记录错误日志......return -1;}fd = open("/dev/null", O_RDWR); if(fd == -1) { //记录错误日志......return -1;}if(dup2(fd, STDIN_FILENO) == -1){ //记录错误日志......return -1;}if(dup2(fd, STDOUT_FILENO) == -1){ //记录错误日志......return -1;}if(fd>STDERR_FILENO) {if(close(fd) == -1){ //记录错误日志......return -1;}}return 1;
}int main(int argc, char *const *argv) {if(ngx_daemon() != 1) {//创建守护进程失败,可以写日志等。return 1;}while(1) {//创建守护进程成功,执行守护进程中工作sleep(1);//无任何显示结果printf("Sleep 1s, PID=%d\n", getpid());}return 0;
}
开机启动守护进程,可以拥有超级用户特权。
守护进程不会收到的信号
- SIGHUP信号
守护进程不会收到来自内核的SIGHUP信号,如果收到,肯定是进程发送过来的。
SIGHUP信号,连接(终端)断开信号,终端检测到连接断开,会发送SIGHUP信号到终端所在的会话首进程。
守护进程和终端不关联,终端断开不会收到SIGHUP信号,可以将该信号挪作他用,比如配置文件改动,守护进程重新读入配置文件。sudo ./nginx -s reload,向已启动master进程发送SIGHUP信号(-1)。
- SIGINT、SIGWINCH信号
守护进程不会收到来自内核的SIGINT、SIGWINCH信号,如果收到,肯定是进程发送过来的。
SIGINT,终端中断符,Ctrl+C(中断组合键)。
SIGWINCH,终端大小改变。
这些信号可以拿来和守护进程通信。
守护进程与后台进程的区别
- 守护进程和终端不挂钩,不向终端输出内容(信息),后台进程能向终端输出内容(信息)。
- 守护进程在关闭终端时不受影响,后台进程会退出。
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- 油溶性/水溶性上转换纳米颗粒之间可以转换
油溶性上转换荧光纳米材料的表面修饰方法,其特征在于:将油溶性上转换荧光纳米材料均匀分散在有机溶剂中,然后加入mPEG2K-b-PEBEP6K并搅拌,再加热去除有机溶剂,离心分离得沉淀烘干,即完成油溶性上转换荧光纳米材料的表面修饰,获得水溶性的上转换荧光纳米材料。油溶性上转换纳米颗…...
2024/4/14 10:06:12 - 打破程序员“中年危机”,如何在35岁以后依然被大厂抢着要?
程序员圈子里一直流传着一个魔咒:35 岁的中年危机。 他们说,35 岁程序员的精力和体力会无法避免地下降; 他们说,35 岁程序员的丰富经验没有年轻员工的创新活力吃香; 他们说,35 岁程序员会面临越来越窄的职业上升通道和日益复杂的社…...
2024/4/14 14:41:13 - react基础学习(002-react面向组件编程)
面向组件编程1. 创建函数式组件2. 创建类式组件1. 创建函数式组件 // 1. 创建函数式组件 function MyComponent () {console.log(this) // 此处的this是undefined,因为babel编译后开启了严格模式return <h2>我是用函数定义的组件</h2> // 2. 渲染组件…...
2024/4/14 10:06:37 - 【linux基操】命令行
vim的操作 创建一个文件 因为我是用python写exp,这里创建一个python文件 touch filename.py 对刚创建的文件用vim编辑 vim用法:可以在命令行输入vim --help查看帮助 用vim打开文件vim filename.py 在进入命令模式后,按a, i, o等键进入插入…...
2024/4/14 18:08:47 - CF1559C Mocha and Hiking(图,思维,构造)
原题链接 题意 输入一个数 nnn ,代表有 n1n 1n1 个点,然后 1−(n−1)1 - (n - 1)1−(n−1),每个点都有一条边连向自己后面那条边。 然后对于点 1−n1 - n1−n,到点 n1n 1n1, 有 nnn 个数 如果 ai0a_i 0ai0 ,代…...
2024/4/14 10:06:22 - Codeforces Round #766 (Div. 2)
A 思路 不难想到,答案只能为0,1,2…或者直接-1 Code #include <iostream> #include <cstdio> #include <algorithm>using namespace std;typedef long long ll;const int N 1e2 10;char G[N][N];void solve(){int r,c…...
2024/4/14 10:06:27 - 洛谷 1724
题目描述 在幻想乡,东风谷早苗是以高达控闻名的高中生宅巫女。某一天,早苗终于入手了最新款的钢达姆模型。作为最新的钢达姆,当然有了与以往不同的功能了,那就是它能够自动行走,厉害吧(好吧,我…...
2024/4/18 9:25:46 - 写一篇最好懂的HTTPS讲解,移动端h5开发
也就是说,使用http传输数据至少存在着数据被监听以及数据被篡改这两大风险,因此http是一种不安全的传输协议。 那么解决方案大家肯定都知道是使用https,但是我们先尝试着自己思考一下该如何保证http传输的安全性,进而也就能一步步…...
2024/4/14 10:06:22 - 日积月累
今日学习 冯.诺依曼体系结构 常用的DOS命令 1.dir (directory)查看某个盘或文件下的目录(所以文件及文件夹); 格式:dir [盘符:][目录路径] [/p] [/s] [/w] [/o]; 解释:([/p]- 分页显示目录内容&…...
2024/4/14 10:06:47 - 18. IAB Considerations【IAB 注意事项】
原文链接:https://datatracker.ietf.org/doc/html/rfc8445#section-18 18. IAB Considerations【IAB 注意事项】 The IAB has studied the problem of “Unilateral Self-Address Fixing” (UNSAF), which is the general process by which an ICE agent attempts…...
2024/4/20 6:37:31 - Fiddler(一)
Fiddler 1、什么是 Fiddler? Fiddler 是一个 HTTP 协议调试代理工具,它能够记录并检查所有你的电脑和互联网之间的 HTTP 通讯。Fiddler 提供了电脑端、移动端的抓包、包括 http 协议和 https 协议都可以捕获到报文并进行分析;可以设置断点调试、截取报…...
2024/4/19 15:39:56 - .NET MCV Swagger 安装和配置
Web Api Swagger发布 1.安装包 右键项目管理NuGet包 安装 Swashbuckle 包 2.修改配置文件 App_Start/SwaggerConfig 行号106 c.IncludeXmlComments(GetXmlCommentsPath(thisAssembly.GetName().Name)); 添加方法 protected static string GetXmlCommentsPath(string name)…...
2024/4/14 10:06:47 - Redis集群架构
Redis集群架构 Redis集群与哨兵比较 哨兵模式 在redis3.0之前,redis实现集群一般是借助哨兵sentinel工具来监控master节点的状态。当master节点异常,则会主从切换,将某一台slave作为master。哨兵的配置略微复杂,并且性能和高可…...
2024/4/17 21:16:23 - 【Course 2 改善深度神经网络】Week 2 优化算法
神经网络的学习的目的是找到使损失函数的值尽可能小的参数。这是寻找最优参数的问题,解决这个问题的过程称为最优化(optimization)。Optimization Algorithms这一节主要讲SGD、Momentum、RMSprop和Adam算法的实现及其优化原理。在实现过程上,有三点可以区…...
2024/4/14 10:07:08 - .net core 多项目中使用EFCore
类库一级项目使用.net core 3.1 框架 其中EFCore是和数据库交互的 MultiCore 注入EFCore中的DBContext与数据库交互 主要为了解决多项目中数据库迁移失败问题 EFCore 工程安装如下包 <Project Sdk"Microsoft.NET.Sdk"><PropertyGroup><TargetFra…...
2024/4/18 0:23:21 - 阿里电话一面
做个自我介绍介绍下项目项目中让你有成就感的部分StringBuffer的底层讲一下String和StringBuffer的差别,StringBuffer和StringBuilder的优化垃圾回收器mysql索引底层笔试算法: a. 按照索引奇偶重构索引 输入: 1->2->3->4->5 输出: 1->3-&…...
2024/4/14 10:07:33 - 游戏仍是“瘸腿”、发行版过多反成“噩梦”?2022 年还不是 Linux 元年
近年来,开源热潮席卷全球,“得开源者得生态,得开源者得天下”逐渐成为了信息产业的一种流行趋势。为此,诸多互联网大厂争相拥抱开源,Linux 作为一款开源操作系统也愈发受开发者喜爱,他们坚信:距离“Linux 桌…...
2024/4/14 10:07:28 - WEB入门浅谈22
WEB入门浅谈22JVMJVM的内存区域划分垃圾回收识别垃圾的手段垃圾回收算法标记清除复制算法标记整理分代回收垃圾回收器类加载初始化流程双亲委派模型补充JVM JVM全称 Java Virtual Machine。就是java的虚拟机,虚拟机就是软件模拟出来的 “计算机” ,是一…...
2024/4/14 10:07:23 - stm32堆栈详解
一、Stack—栈 ; <h> Stack Configuration ; <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> ; </h>Stack_Size EQU 0x400AREA STACK, NOINIT, READWRITE, ALIGN3 Stack_Mem SPACE Stack_Size __initial_sp 栈的作用是用于局部变量…...
2024/4/20 10:59:16 - 算法分析与设计——背包问题
给定n种物品和一背包。物品i的重量是wi>0,其价值为vi>0,背包的容量为c。问应如何选择装入背包中的物品,使得装入背包中物品的总价值最大? (要求使用回溯法) 步骤: 输入物品数量n&#x…...
2024/4/7 15:28:30
最新文章
- spring bean的生命周期你了解么
Spring Bean的生命周期是指在Spring容器中创建、初始化、使用和销毁Bean实例的整个过程。理解Spring Bean的生命周期对于开发者来说非常重要,因为它涉及到在不同的生命周期阶段执行自定义逻辑的机会。下面是关于Spring Bean生命周期的详细解释,包括各个阶…...
2024/5/3 12:00:41 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/3/20 10:50:27 - Linux中的错误处理艺术:理解错误编号与头文件引用
引言 在Linux环境下开发程序时,准确且有效地处理错误是至关重要的。操作系统通过错误编号(Error Number)向程序反馈各种异常情况,帮助开发者定位和修复问题。本文将深入探讨Linux错误处理机制,并介绍如何查找特定错误…...
2024/4/30 17:33:51 - Verilog基础【二】
3.1 Verilog 连续赋值 关键词:assign, 全加器 连续赋值语句是 Verilog 数据流建模的基本语句,用于对 wire 型变量进行赋值。: assign LHS_target RHS_expression ;LHS(left hand side)…...
2024/5/3 0:42:09 - Linux中的shell脚本之流程控制循环遍历
3 条件判断 4 流程控制语句 1)if 语句 案例,用户输入用户名和密码,判断用户名是否是admin,密码是否是123,如果正确,则显示登录成功 首先我创建了shell文件,touch getpawer 其中getpawer 是我自己命的名 #!/bin/bas…...
2024/5/1 13:38:30 - 【外汇早评】美通胀数据走低,美元调整
原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...
2024/5/1 17:30:59 - 【原油贵金属周评】原油多头拥挤,价格调整
原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...
2024/5/2 16:16:39 - 【外汇周评】靓丽非农不及疲软通胀影响
原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到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/5/2 9:28:15 - 【外汇早评】日本央行会议纪要不改日元强势
原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...
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/5/2 15:04:34 - 【外汇早评】美伊僵持,风险情绪继续升温
原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...
2024/4/28 1:34:08 - 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势
原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...
2024/4/26 19:03:37 - 氧生福地 玩美北湖(上)——为时光守候两千年
原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...
2024/4/29 20:46:55 - 氧生福地 玩美北湖(中)——永春梯田里的美与鲜
原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...
2024/4/30 22:21:04 - 氧生福地 玩美北湖(下)——奔跑吧骚年!
原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...
2024/5/1 4:32:01 - 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!
原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...
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/5/2 9:07:46 - 械字号医用眼膜缓解用眼过度到底有无作用?
原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含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