您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 操作系统之进程管理控制
WINDOWS的系统调用API(ApplicationProgrammingInterface),应用编程接口,其实就是操作系统留给应用程序的一个调用接口,应用程序通过调用操作系统的API而使操作系统去执行应用程序的命令(动作)。WindowsAPIAPI函数包含在Windows系统目录下动态连接库文件。WindowsAPI是一套控制Windows的各个部件的外观和行为的预先定义的Windows函数。用户的每个动作都会引发一个或几个函数的运行以告诉Windows发生了什么。API函数包括:网络函数消息函数文件处理函数打印函数文本和字体函数菜单函数位图运算函数绘图函数设备场景函数硬件与系统函数进程和线程函数#includewindows.hintmain(){MessageBox(NULL,Firstprogram!,example,MB_OK);return0;}//MessageBox函数用于创建、显示并操作一个消息对话框。进程的管理控制fork创建一个新进程clone按指定条件创建子进程execve运行可执行文件exit中止进程_exit立即中止当前进程getdtablesize进程所能打开的最大文件数getpgid获取指定进程组标识号setpgid设置指定进程组标志号getpgrp获取当前进程组标识号setpgrp设置当前进程组标志号getpid获取进程标识号getppid获取父进程标识号getpriority获取调度优先级setpriority设置调度优先级modify_ldt读写进程的本地描述表nanosleep使进程睡眠指定的时间nice改变分时进程的优先级pause挂起进程,等待信号personality设置进程运行域prctl对进程进行特定操作ptrace进程跟踪sched_get_priority_max取得静态优先级的上限sched_get_priority_min取得静态优先级的下限sched_getparam取得进程的调度参数sched_getscheduler取得指定进程的调度策略sched_rr_get_interval取得按RR算法调度的实时进程的时间片长度sched_setparam设置进程的调度参数sched_setscheduler设置指定进程的调度策略和参数sched_yield进程主动让出处理器,并将自己等候调度队列队尾vfork创建一个子进程,以供执行新程序,常与execve等同时使用wait等待子进程终止wait3参见waitwaitpid等待指定子进程终止wait4参见waitpidcapget获取进程权限capset设置进程权限getsid获取会晤标识号setsid设置会晤标识号返回值:为了区分父、子进程,fork给两个进程返回不同的值。如果调用成功�对于父进程,fork()返回新创建子进程的进程标识符;�对于子进程,fork()返回0;如果调用失败�fork()没有创建子进程。返回-1。fork函数功能:创建一个新进程函数原型:pid_tfork(void);/*t2.c*/#includestdio.hintmain(){intpid;printf(just1processnow.\n);pid=fork();if(pid==0)printf(iamthechild.\n);elseif(pid0)printf(iamtheparent.\n);elseprintf(forkfailed.\n);printf(programend.\n);return0;}运行结果:taojing@ubuntu:~$geditt2.ctaojing@ubuntu:~$gcct2.ctaojing@ubuntu:~$./a.outjust1processnow.iamtheparent.programend.taojing@ubuntu:~$iamthechild.programend./*t3.c*/#includestdio.hintmain(){intcount=0;intpid;pid=fork();if(pid0)printf(parentprocess:%d\n,++count);if(pid==0)printf(childprocess:%d\n,++count);return0;}运行结果:taojing@ubuntu:~$geditt3.ctaojing@ubuntu:~$gcct3.c-ob.outtaojing@ubuntu:~$./b.outparentprocess:1taojing@ubuntu:~$childprocess:1vfork的作用与fork基本相同,和fork调用不同的是,调用vfork对于父子进程的执行次序有所限制,调用vfork时,父进程被挂起,子进程运行至调用exit时解除这种状态。因此,总是子进程先返回。/*t4.c*/#includestdlib.h#includestdio.hintmain(){intpid;pid=vfork();if(pid0)printf(Parentprocessisprinting.\n);if(pid==0){sleep(5);printf(Childprocessisprinting.\n);}exit(0);return0;}运行结果:taojing@ubuntu:~$geditt4.ctaojing@ubuntu:~$gcct4.c-oc.outtaojing@ubuntu:~$./c.outChildprocessisprinting.Parentprocessisprinting.getpid函数功能:返回进程的PID。函数原型:pid_tgetpid(void);/*t5.c*/#includestdio.hintmain(intargc,char*argv[]){intpid;printf(1.%s:BEGIN\n,argv[0]);pid=fork();if(pid0){printf(2.parent,pid=%d\n,pid);sleep(10);}if(pid==0)printf(3.child,pid=%d\n,pid);printf(4.mypidis%d,parent'spidis%d\n,getpid(),getppid());printf(5.%s:END\n,argv[0]);return0;}运行结果:taojing@ubuntu:~$gcct5.c-od.outtaojing@ubuntu:~$./d.out1../d.out:BEGIN2.parent,pid=37883.child,pid=04.mypidis3788,parent'spidis37875../d.out:END4.mypidis3787,parent'spidis25555../d.out:ENDexit函数功能:终止正在运行的程序。函数原型:voidexit(intstatus);说明:�该函数将回收与进程相关的各种内核数据结构,把进程的状态置为TASK_ZOMBIE。�参数status用来传递进程结束时的状态。�一般来说,0表示没有意外的正常结束;其他数值表示进程出现了错误,非正常结束。注意:一个进程调用了exit之后,该进程并非马上消失,而是变为僵尸状态,它还保留了PCB等资源没有释放等待父进程调用wait()对其资源进行回收。wait函数功能:等待当前进程的子进程终止,获取子进程终止的状态并回收僵尸子进程占用的系统资源。函数原型:pid_twait(int*status);说明:�函数的返回值是已终止的子进程的PID号。�status是子进程结束时,返回的进程终止状态信息的地址。�调用形式可以简写为wait(0),不需要返回状态及进程的PID。�wait()常用来控制父、子进程的同步。/*t7.c*/#includestdio.h#includestdlib.hintmain(){intpc,pr;pc=fork();if(pc==0){printf(thepidofchildprocess:%d\n,getpid());sleep(10);}if(pc0){pr=wait(0);printf(Ichachedachildprocesswithpidof%d\n,pr);}exit(0);return0;}运行结果:taojing@ubuntu:~$gcct7.c-of.outtaojing@ubuntu:~$./f.outthepidofchildprocess:3657Ichachedachildprocesswithpidof3657说明:在父进程中使用系统调用wait暂停父进程的执行,使之处于阻塞状态。进入阻塞队列。一旦子进程执行毕,会产生一个终止状态信息,处于阻塞状态的父进程便会被系统唤醒,父进程提取子进程的终止状态信息,从而继续执行。当参数status不为NULL时,子进程的结束信息放在status中,利用这个状态字可以了解子程序结束的原因。在sys/wait.h中定义了几个宏:WIFEXITED(status):如果进程正常终止,则为真。可以用WEXITSTATUS(status)获得子进程的返回码。WIFSIGNALED(status):如果进程异常终止,则为真。可以用WTERMSIG(status)获得子进程被杀的信号值。/*t8.c*/#includestdio.h#includestdlib.hintmain(){intpid,stat;pid=fork();if(pid0){printf(Childprocessis%d\n,pid);pid=wait(&stat);printf(Childprocess%dends\n,pid);if(WIFEXITED(stat))printf(Exitcodeis%d\n,WEXITSTATUS(stat));if(WIFSIGNALED(stat))printf(Killedbyasignal%d\n,WTERMSIG(stat));}if(pid==0){printf(Iamthechildprocess.\n);exit(1);}printf(Bye!\n);return0;}运行结果:taojing@ubuntu:~$gcct8.c-og.outtaojing@ubuntu:~$./g.outChildprocessis3730Iamthechildprocess.Childprocess3730endsExitcodeis1Bye!当一个管道建立后,将获得两个文件描述符,分别用于对管道读取和写入,通常将其称为管道的写入端和管道的读取端。管道是一种特殊文件,用户在使用中完全可以像读写普通文件一样使用read和write对管道进行读写。pipe函数功能:创建一个管道。函数原型:intpipe(intfiledes[2]);参数:filedes[2]:包括2个整数的数组,存放打开文件描述符。filedes[0]:存放管道读端文件描符;filedes[1]:存放管道写端文件描述符。读管道规则:关闭管道的写端:close(fd[1]);读出:read(fd[0],buf,size);读出后关闭管道的读端:close(fd[0]);写管道规则:关闭管道的读端:close(fd[0]);写入:write(fd[1],buf,size);写入后关闭管道的写端:close(fd[1]);/*t9.c*/#includestdio.h#includestdlib.hintmain(){intfd[2],pid;charstr[50];pipe(fd);pid=fork();if(pid0){close(fd[0]);write(fd[1],Goodmorning!,30);printf(parent,writetopipesuccessfully!\n);wa
本文标题:操作系统之进程管理控制
链接地址:https://www.777doc.com/doc-3836443 .html