版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第第7章章Linux进程管理与程序开发进程管理与程序开发7.1进程环境及进程属性进程环境及进程属性 7.1.1程序及进程环境程序及进程环境 7.1.2进程的基本属性进程的基本属性7.2Linux进程控制进程控制 7.2.1创建进程创建进程 7.2.2运行新进程运行新进程 7.2.3等待进程结束等待进程结束 7.2.4退出进程退出进程 7.2.5修改进程用户相关信息修改进程用户相关信息 7.2.6复制进程复制进程7.3Linux进程调度进程调度 7.3.1进程状态进程状态 7.3.2Linux常用调度算法常用调度算法 7.3.3调度管理函数调度管理函数7.1进程环境及进程属性进程环境及进程属性7
2、.1.1程序及进程环境程序及进程环境1、什么是进程、什么是进程 进程为应用程序的运行实例,是应用程序的一次进程为应用程序的运行实例,是应用程序的一次动态执行。我们可以简单地理解为:它是操作系统当动态执行。我们可以简单地理解为:它是操作系统当前运行的执行程序。前运行的执行程序。 通俗的讲程序是一个包含可以执行代码的文件通俗的讲程序是一个包含可以执行代码的文件,是是一个静态的文件。而进程是一个开始执行但是还没有一个静态的文件。而进程是一个开始执行但是还没有结束的程序的实例。结束的程序的实例。 当程序被系统调用到内存以后当程序被系统调用到内存以后,系统会给程序分配系统会给程序分配一定的资源一定的资源
3、(内存内存,设备等等设备等等)然后进行一系列的复杂操然后进行一系列的复杂操作,使程序变成进程以供系统调用。在系统里面只有作,使程序变成进程以供系统调用。在系统里面只有进程没有程序进程没有程序,为了区分各个不同的进程为了区分各个不同的进程,系统给每一个系统给每一个进程分配了一个进程分配了一个PID(进程标识符进程标识符)以便识别。以便识别。 2、查看进程、查看进程(1)ps命令命令# ps 参数参数常见参数有:常见参数有:-A 显示所有程序显示所有程序-f 显示进程较完整信息显示进程较完整信息-l 显示进程最完整信息显示进程最完整信息(2)/proc目录目录该目录中包括进程信息、内核信息等特殊文
4、件。该目录中包括进程信息、内核信息等特殊文件。例:例:# cat /proc/cpuinfo 查看查看cpu信息信息# cat /proc/meminfo 查看内存信息查看内存信息# cat /proc/version 查看内核版本信息查看内核版本信息# ls l /proc/1 查看查看1号进程的信息号进程的信息3、进程调度、进程调度(1)init进程进程 每个进程都是由另一个称之为每个进程都是由另一个称之为“父进程父进程”的进程启的进程启动的,被父进程启动的进程叫做动的,被父进程启动的进程叫做“子进程子进程”。 linux启动时将运行启动时将运行init进程,该进程是系统运行的进程,该进程
5、是系统运行的第一个进程,它的进程号为第一个进程,它的进程号为1,它是其他所有进程的祖,它是其他所有进程的祖先进程。其他进程要么是先进程。其他进程要么是init启动的,要么是启动的,要么是init进程启进程启动的其他进程启动的。动的其他进程启动的。例:例:# ps Al注意:在显示的信息中注意:在显示的信息中 PID:本进程的进程号本进程的进程号 PPID:父进程的进程号父进程的进程号(2)进程调度原理)进程调度原理 在一台单处理器计算机上,同一时间只能有一个在一台单处理器计算机上,同一时间只能有一个进程可以运行,其他进程处于等待运行状态。每个进进程可以运行,其他进程处于等待运行状态。每个进程轮
6、到的运行时间(时间片)是相当短暂的,这就给程轮到的运行时间(时间片)是相当短暂的,这就给人一种多个程序在同时运行的印象。人一种多个程序在同时运行的印象。 每个进程都有一个关联的优先级,优先级越高的每个进程都有一个关联的优先级,优先级越高的进程将分配到更多的进程将分配到更多的CPU时间。时间。注意注意1:优先级数值越大,执行优先级越低。:优先级数值越大,执行优先级越低。例:例:# renice 10 某进程号某进程号该命令可以使某进程号优先数值加该命令可以使某进程号优先数值加10# renice -5 某进程号某进程号该命令可以使某进程号优先数值减该命令可以使某进程号优先数值减5 注意注意2:在
7、:在linux中,进程的运行时间不可能超过分中,进程的运行时间不可能超过分配给它的时间片。它采用的是抢先式多任务处理,配给它的时间片。它采用的是抢先式多任务处理,所以进程的挂起和继续执行无需彼此间的协作。所以进程的挂起和继续执行无需彼此间的协作。7.1.2进程的基本属性进程的基本属性1、进程号(、进程号(PID) PID是一个由系统维护的唯一标识一个进程的正整是一个由系统维护的唯一标识一个进程的正整数。在数。在Linux中系统的第一个进程为中系统的第一个进程为init进程,它的进程,它的PID为为1。其他进程的。其他进程的PID依次增加。依次增加。PID是有最大值的,是有最大值的,通常在通常在
8、/proc/sys/kernel/pid_max里保存(里保存(32768),如果达到这个最大值,系统会重复使用较小的如果达到这个最大值,系统会重复使用较小的pid,通,通常不会有常不会有pid_max个程序同时运行。个程序同时运行。 #include extern _pid_t getpid(void) _THROW;可通过该函数获得当前进程的可通过该函数获得当前进程的PID。 注意注意1: 在在/usr/include/uinstd.htypedef _pid_t pid_t;在在/usr/include/bits/types.h _STD_TYPE _PID_T_TYPE _pid_t;
9、#define _STD_TYPE typedef#define _PID_T_TYPE _S32_TYPE#define _S32_TYPE int 注意注意2: 宏宏_THROW : Linux内核的源文件里常会出现这个。其实并不复杂,只是简单的宏定义,内核的源文件里常会出现这个。其实并不复杂,只是简单的宏定义,# if defined _cplusplus # define _THROW throw () # else # define _THROW # endifc+调用的情况下调用的情况下,会在函数声明后加入会在函数声明后加入 throw()表明该函数不会扔出异常表明该函数不会扔出异
10、常,这样避免编译器生成对异常的处理代码这样避免编译器生成对异常的处理代码,优化生成结果优化生成结果. 注意注意3:(1)内部函数:只能被本文件中其它函数调用。)内部函数:只能被本文件中其它函数调用。static int fun (int a,int b)(2)外部函数:可以被其它文件中的函数调用。)外部函数:可以被其它文件中的函数调用。extern int fun (int a,int b) 可省略可省略extern ,默认为默认为extern。例:例:getpid_example.c#include#includeint main(int argc,char *argv) printf(th
11、e current programs pid is %dn,getpid(); return 0;2、父进程号(、父进程号(PPID) 每个进程都是由另一个称之为每个进程都是由另一个称之为“父进程父进程”的进的进程启动的,被父进程启动的进程叫做程启动的,被父进程启动的进程叫做“子进程子进程”。#include extern _pid_t getppid(void) _THROW;可通过该函数获得当前进程的可通过该函数获得当前进程的PPID。#include#includeint main(int argc,char *argv) printf(the current programs ppid
12、 is %dn,getppid(); return 0;例:例:getppid_example.c3、进程组号(、进程组号(PGID) 进程拥有自己的进程号和进程组号。当进程生成子进程拥有自己的进程号和进程组号。当进程生成子进程时,操作系统自动创建一个进程组。初始的父进程进程时,操作系统自动创建一个进程组。初始的父进程即为主进程,其进程组号与进程号相同。即为主进程,其进程组号与进程号相同。 主进程创建的所有子进程拥有相同的进程组号。主进程创建的所有子进程拥有相同的进程组号。#include extern _pid_t getpgid(_pid_t _pid) _THROW;可通过该函数获得指定
13、进程的可通过该函数获得指定进程的PPID。其中参数其中参数pid为要获得进程组号的进程号,如果为为要获得进程组号的进程号,如果为0表示表示获取当前进程组号。获取当前进程组号。例:例:getpgid_example.c4、进程真实用户号(、进程真实用户号(UID)对进程而言,创建者的对进程而言,创建者的ID为此进程真实用户号。为此进程真实用户号。#include extern _uid_t getuid(void) _THROW;可通过该函数获得当前进程的可通过该函数获得当前进程的UID。5、进程有效用户号(、进程有效用户号(EUID) 多数情况下,多数情况下,EUID和和UID相同。如果可执行
14、文件的相同。如果可执行文件的setuid位有效,在除该文件的拥有者之外的用户运行该位有效,在除该文件的拥有者之外的用户运行该程序是,程序是, EUID和和UID则不相同。则不相同。 由图由图5-1的文件模式可知,第的文件模式可知,第911位为该文件的权位为该文件的权限修饰位,包括限修饰位,包括setuid、setgid和和sticky位。位。 如果一个文件的如果一个文件的setuid位被设置,则该文件被执行位被设置,则该文件被执行时,进程的时,进程的EUID被设置成该文件的所有者。被设置成该文件的所有者。 setuid位能让普通用户以位能让普通用户以root用户的角色运行只有用户的角色运行只有
15、root帐号才能运行的程序或命令。帐号才能运行的程序或命令。#include extern _uid_t geteuid(void) _THROW;可通过该函数获得当前进程的可通过该函数获得当前进程的EUID。#include extern _uid_t getgid(void) _THROW;可通过该函数获得当前进程的可通过该函数获得当前进程的GID。6、进程真实用户组号(、进程真实用户组号(GID)对进程而言,创建者的用户所在组号即为此进程真实对进程而言,创建者的用户所在组号即为此进程真实用户组号。用户组号。7、进程有效用户组号(、进程有效用户组号(EGID) 如果一个文件的如果一个文件的
16、setgid位被设置,则该文件被执行位被设置,则该文件被执行时,进程的时,进程的EGID被设置成该文件的所有者。被设置成该文件的所有者。 #include extern _uid_t getegid(void) _THROW;可通过该函数获得当前进程的可通过该函数获得当前进程的EGID。例:例:getid_example.c7.2 Linux进程控制进程控制7.2.1 创建进程创建进程1、 fork创建新进程创建新进程#include extern _pid_t fork(void) _THROW;可通过该函数创建一个新进程。可通过该函数创建一个新进程。最初的进程最初的进程fork()返回新的
17、返回新的PID返回返回0继续执行原进程继续执行原进程新进程新进程 当一个进程调用了当一个进程调用了fork以后以后,系统会创建一个子进系统会创建一个子进程。这个子进程和父进程不同的地方只有它的进程程。这个子进程和父进程不同的地方只有它的进程ID和和父进程父进程ID,其他的都是一样。就象克隆其他的都是一样。就象克隆(clone)自己一样。自己一样。当然创建两个一模一样的进程是没有意义的。为了区分当然创建两个一模一样的进程是没有意义的。为了区分父进程和子进程父进程和子进程,我们必须跟踪我们必须跟踪fork的返回值。当的返回值。当fork调调用失败的时候用失败的时候(内存不足或者是用户的最大进程数已
18、内存不足或者是用户的最大进程数已到到)fork返回返回-1,否则,否则fork的返回值有重要的作用。的返回值有重要的作用。 对于父进程对于父进程fork返回子进程的返回子进程的ID,而对于,而对于fork子进子进程返回程返回0。我们就是根据这个返回值来区分父子进程的。我们就是根据这个返回值来区分父子进程的。例:例:fork_example01.c#include#include#includeint main(int argc,char *argv) pid_t pid; if(pid=fork()=-1) printf(fork error); printf(bye!n); return 0
19、;例:例:fork_example02.c#include#include#includeint main(void) pid_t pid; if(pid=fork()=-1) printf(fork error); else if(pid=0) printf(in the child processn); else printf(in the parent processn); return 0;例:例:fork_descriptor.c fork函数创建子进程后,子进程将复制父进函数创建子进程后,子进程将复制父进程的数据段、代码段、程的数据段、代码段、BSS段、堆和栈。段、堆和栈。 但对于
20、但对于文件描述符则是以共享的方式使用。文件描述符则是以共享的方式使用。 父进程为什么要创建子进程呢父进程为什么要创建子进程呢?(1)调用)调用fock创建子进程后,父进程中所有打创建子进程后,父进程中所有打开的描述字在子进程中是共享的,这个特性在网开的描述字在子进程中是共享的,这个特性在网络服务器中广泛使用,例如父进程通过络服务器中广泛使用,例如父进程通过socket函函数返回一个套接字,然后调用数返回一个套接字,然后调用fock函数创建子进函数创建子进程,这个子进程就可以直接对这个已经存在的套程,这个子进程就可以直接对这个已经存在的套接字进行操作。接字进行操作。(2)fock的另一个典型应用
21、是创建一个子进程的另一个典型应用是创建一个子进程调用调用exec函数来代替自己去执行新的程序。函数来代替自己去执行新的程序。 2、vfork快速创建新进程快速创建新进程vfork创建的子进程共享父进程的代码段及数据段等。创建的子进程共享父进程的代码段及数据段等。#include extern _pid_t vfork(void) _THROW;可通过该函数创建一个新进程。可通过该函数创建一个新进程。例:例:vfork_fork_example01.c例:例:vfork_fork_example02.c Linux系统执行以文件形式存储在磁盘上的可执行系统执行以文件形式存储在磁盘上的可执行程序的
22、方法是用一个现有的进程去调用六个程序的方法是用一个现有的进程去调用六个exec函数之函数之一,六个一,六个exec函数定义如下:函数定义如下:#include int execl(const char *path,const char *arg0,. (char *) 0 ); int execlp(const char *filename,const char *arg0,. (char *)0);int execle(const char *path,const char *arg0,. (char *)0, char *const envp); int execv(const char
23、*path,char *const argv); int execvp(const char *filename,char *const argv); int execve(const char * path,char *const argv,char *const envp);7.2.2 运行新进程运行新进程 exec系列函数可把当前进程替换为一个新进程。系列函数可把当前进程替换为一个新进程。 例:例:const char *ps_argv=“ps”, “-Al”,0;const char *ps_envp=“PATH=/bin:/usr/bin”,0;execl(“/bin/ps”, “p
24、s”, “-Al”,0);execlp(“ps”, “ps”, “-Al”,0);execle(“ps”, “ps”, “-Al”,0,ps_envp);execv(“/bin/ps”, ps_argv);execvp(“ps”, ps_argv);execve(“ps”, ps_argv,ps_envp);例:例:#include #include int main() printf(Running.n); execl(/bin/ps,ps,-Al,0); printf(Donen); exit(0);上例中,执行完上例中,执行完ps新进程之后,并不回到原主函新进程之后,并不回到原主函数中,
25、所以数中,所以Done并不输出。并不输出。注意注意1:execl函数把新程序装入调用进程的内函数把新程序装入调用进程的内存空间,来改变调用进程的执行代码。当存空间,来改变调用进程的执行代码。当execl函数执行成功,调用进程将被覆盖,相当于产生函数执行成功,调用进程将被覆盖,相当于产生一个新进程,但是新进程的一个新进程,但是新进程的PID和调用进程的和调用进程的PID相同,所以相同,所以execl并没创建一个新进程,而并没创建一个新进程,而是用新进程取代了调用进程。是用新进程取代了调用进程。 注意注意2: fork函数可以创建一个子进程而当函数可以创建一个子进程而当前进程不死,如果我们在前进程
26、不死,如果我们在fork的子进程中调的子进程中调用用exec函数族就可以实现既让父进程的代码函数族就可以实现既让父进程的代码执行又启动一个新的指定进程,这实在是很执行又启动一个新的指定进程,这实在是很妙的。妙的。fork和和exec的搭配巧妙地解决了程序的搭配巧妙地解决了程序启动另一程序的执行但自己仍继续运行的问启动另一程序的执行但自己仍继续运行的问题题 可以在一个程序的内部启动另一个程序,从而创建可以在一个程序的内部启动另一个程序,从而创建一个新进程。这个过程需要库函数一个新进程。这个过程需要库函数system。#include int system(const char *string);
27、该函数的作用是:运行以字符串参数形式传递给它该函数的作用是:运行以字符串参数形式传递给它的命令。的命令。例:例:system.c的源程序如下:的源程序如下:#include #include int main() printf(Running.n); system(ps -Al); printf(Donen); exit(0);上例中,只有上例中,只有system函数启动的进程结束之后,才函数启动的进程结束之后,才能继续执行主函数。能继续执行主函数。7.2.3等待进程结束等待进程结束1、wait(等待子进程中断或结束)(等待子进程中断或结束) 头文件:头文件: #include #includ
28、e定义:定义: pid_t wait (int *status);功能:功能: wait()会暂时停止目前进程的执行,直到有信会暂时停止目前进程的执行,直到有信号来到或子进程结束。如果在调用号来到或子进程结束。如果在调用wait()时子进程已时子进程已经结束,则经结束,则wait()会立即返回子进程结束状态值。子会立即返回子进程结束状态值。子进程的结束状态值会由参数进程的结束状态值会由参数status 返回,而子进程的返回,而子进程的进程识别码也会返回。如果不在意结束状态值,则参进程识别码也会返回。如果不在意结束状态值,则参数数 status可以设成可以设成NULL。返回值:如果执行成功则返回
29、子进程识别码返回值:如果执行成功则返回子进程识别码(PID),如,如果有错误发生则返回果有错误发生则返回-1。 子进程的结束状态返回后存于子进程的结束状态返回后存于status,底下有几个宏可,底下有几个宏可判别结束情况:判别结束情况:WIFEXITED(status)如果子进程正常结束则为非如果子进程正常结束则为非0值。值。WEXITSTATUS(status)取得子进程取得子进程exit()返回的结束代码,返回的结束代码,一般会先用一般会先用WIFEXITED 来判断是否正常结束才能使用此宏。来判断是否正常结束才能使用此宏。WIFSIGNALED(status)如果子进程是因为信号而结束则
30、此如果子进程是因为信号而结束则此宏值为真宏值为真WTERMSIG(status)取得子进程因信号而中止的信号代码,取得子进程因信号而中止的信号代码,一般会先用一般会先用WIFSIGNALED 来判断后才使用此宏。来判断后才使用此宏。 程序中的程序中的exit(EXIT_SUCCESS)表示程序正常结束,表示程序正常结束,与之对应的与之对应的exit(EXIT_FAILURE)表示程序执行错误,表示程序执行错误,只能强行终止。只能强行终止。EXIT_SUCCESS、EXIT_FAILURE分分别定义为别定义为0和和1。例:例:wait_example.c2、waitpid 头文件头文件:#inc
31、lude #include定义定义: pid_t waitpid(pid_t pid,int * status,int options); 功能:与功能:与wait函数功能类似。参数函数功能类似。参数pid为欲等待的子进程为欲等待的子进程识别码,其他数值意义如下识别码,其他数值意义如下:pid0 等待任何子进程识别码为等待任何子进程识别码为pid的子进程。的子进程。参数参数option可以为可以为0 或下面的或下面的OR 组合组合WNOHANG 如果没有任何已经结束的子进程则马上返回,如果没有任何已经结束的子进程则马上返回,不予以等待。不予以等待。WUNTRACED 如果子进程进入暂停执行情况
32、则马上返回,如果子进程进入暂停执行情况则马上返回,但结束状态不予以理会。但结束状态不予以理会。7.2.4退出进程退出进程1、abort函数函数定义定义: void abort(void);头文件:头文件:#include 功功 能:能:abort函数是一个比较严重的函数,当调用它时,会导函数是一个比较严重的函数,当调用它时,会导致程序异常终止,而不会进行一些常规的清除工作,比如释放致程序异常终止,而不会进行一些常规的清除工作,比如释放内存等。例内存等。例:#include #include int main(void) puts( About to abort.n ); abort(); pu
33、ts( This will never be executed!n ); exit( EXIT_SUCCESS );2、atexit头文件:头文件: #include定义:定义: int atexit (void (*function)(void);功能:功能: atexit()用来设置一个程序正常结束前调用的函数。当程用来设置一个程序正常结束前调用的函数。当程序通过调用序通过调用 exit()或从或从 main 中返回时中返回时,参数参数 function 所指定的所指定的函数会先被调用函数会先被调用,然后才真正由然后才真正由 exit()结束程序。结束程序。 #include #inclu
34、de void my_exit(void) printf( Before exit.n );int main(void) atexit( my_exit ); return 0;3、on_exit头文件:头文件: #include定义:定义: int on_exit(void (* function)(int, void*),void *arg);功能:功能: on_exit()用来设置一个程序正常结束前调用的函数。当程用来设置一个程序正常结束前调用的函数。当程序通过调用序通过调用exit()或从或从main中返回时,参数中返回时,参数function所指定的函数所指定的函数会先被调用,然后才
35、真正由会先被调用,然后才真正由exit()结束程序。参数结束程序。参数arg指针会传给指针会传给参数参数function函数。范例:函数。范例:#includevoid my_exit(int status,void *arg) printf(“before exit()!n”); printf(“exit (%d)n”,status); printf(“arg = %sn”,(char*)arg);main() char * str=”test”; on_exit(my_exit,(void *)str); exit(1234); 执行结果:执行结果:before exit()!exit (
36、1234)arg = test4、exit函数函数头文件:头文件: #include定义:定义: void exit(int status);功能:功能:exit()用来正常终结目前进程的执行用来正常终结目前进程的执行,并把参数并把参数 status 返回返回给父进程给父进程, 而进程所有的缓冲区数据会自动写回并关闭未关闭的而进程所有的缓冲区数据会自动写回并关闭未关闭的文件。它并不像文件。它并不像abort那样不做任何清理工作就退出,而是在完那样不做任何清理工作就退出,而是在完成所有的清理工作后才退出程序。成所有的清理工作后才退出程序。5、_exit(结束进程执行)(结束进程执行) 头文件:头
37、文件: #include定义:定义: void _exit(int status); 功能:功能: _exit()用来立刻结束目前进程的执行,并把参用来立刻结束目前进程的执行,并把参数数status返回给父进程,并关闭未关闭的文件。此函数返回给父进程,并关闭未关闭的文件。此函数调用后不会返回,并且会传递调用后不会返回,并且会传递SIGCHLD信号给父进程,信号给父进程,父进程可以由父进程可以由wait函数取得子进程结束状态。函数取得子进程结束状态。 _exit ()不会处理标准不会处理标准I/O 缓冲区,如要更新缓冲区请使缓冲区,如要更新缓冲区请使用用exit()。()。 7.2.5修改进程用
38、户相关信息修改进程用户相关信息1、access核实用户权限核实用户权限头文件头文件: #include 定义定义: int access(const char * pathname, int mode); 功能:功能: 该函数判断是否具有存取文件的权限。参数该函数判断是否具有存取文件的权限。参数mode有有几种情况组合,几种情况组合,R_OK,W_OK,X_OK 和和F_OK。R_OK,W_OK与与X_OK用来检查文件是否具有读取、写入和执行的用来检查文件是否具有读取、写入和执行的权限。权限。F_OK则是用来判断该文件是否存在。则是用来判断该文件是否存在。返回值:若所有欲查核的权限都通过了检查
39、则返回返回值:若所有欲查核的权限都通过了检查则返回0值,表示值,表示成功,只要有一权限被禁止则返回成功,只要有一权限被禁止则返回-1。例:例:access_example.c2、setuid 和和 setgid头文件:头文件:#include定义:定义:int setuid(uid_t uid) int setgid(gid_t gid);函数说明:函数说明: setuid()用来重新设置执行目前进程的用用来重新设置执行目前进程的用户识别码。不过,要让此函数有作用,其有效的用户户识别码。不过,要让此函数有作用,其有效的用户识别码必须为识别码必须为0(root)。在。在Linux下,当下,当root使用使用setuid()来变换成其他用户识别码时,来变换成其他用户识别码时,root权限会被抛权限会被抛弃,完全转换成该用户身份。弃,完全转换成该用户身份。 返回值:执行成功则返回返回值:执行成功则返回0,失败则返回,失败则返回-1。例:例:setuid_example.c3、seteuid 和和 setegid头文件:头文件: #include定义:定义: i
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 针对新兴市场的2026年社交电商用户增长方案
- 2026年智慧建筑绿色节能改造方案
- 轻工业市场拓展策略研究报告及2025分析
- 2025年农业节水灌溉系统差异化节水效果论证可行性研究报告
- 多层级铁路系统智能化管理方案-洞察及研究
- 2025广东广州市南沙区社区专职工作人员招聘10人备考题库(第二场)及完整答案详解
- 2025广西百色市乐业县消防救援大队招聘乐业县消防救援综合服务中心管理人员3人备考题库附答案详解(培优a卷)
- 2025重庆市长寿区凤城街道办事处公益性岗位招聘1人备考题库含答案详解(研优卷)
- 泰隆银行2026校园招聘备考题库及答案详解(真题汇编)
- 2025年中职行政管理(行政管理教学法)试题及答案
- 颂钵疗愈课件
- 如何培养孩子的良好阅读习惯
- 《化工生产技术》课程标准
- 肉用乳鸽生产及管理技术规程编制说明
- 店长年终总结PPT模板含完整内容12
- 中广核面试开放性问题
- 走进舞蹈艺术-首都师范大学中国大学mooc课后章节答案期末考试题库2023年
- 肿瘤科专业组药物临床试验管理制度及操作规程GCP
- 七年级数学竞赛模拟试题北师大版
- YS/T 690-2009天花吊顶用铝及铝合金板、带材
- GB/T 4456-2008包装用聚乙烯吹塑薄膜
评论
0/150
提交评论