当前位置:首页 » 手机资讯 » 系统是怎样创建进程的
扩展阅读
别人想坑你的原因有哪些 2024-10-23 02:57:03
word怎样把文件变成图片 2024-10-23 02:46:37

系统是怎样创建进程的

发布时间: 2022-01-22 17:13:01

‘壹’ 操作系统 思考题 系统是怎样创建进程的

在编写Java程序时,有时候需要在Java程序中执行另外一个程序。1、启动程序Java提供了两种方法用来启动其它程序:(1)使用Runtime的exec()方法(2)使用ProcessBuilder的start()方法不管在哪种操作系统下,程序具有基本类似的一些属性。一个程序启动后就程序操作系统的一个进程,进程在执行的时候有自己的环境变量、有自己的工作目录。Runtime和ProcessBuilder提供了不同的方式来启动程序,设置启动参数、环境变量和工作目录。能够在Java中执行的外部程序,必须是一个实际存在的可执行文件,对于shell下的内嵌命令是不能直接执行的。采用Runtime的exec执行程序时,首先要使用Runtime的静态方法得到一个Runtime,然后调用Runtime的exec方法。可以将要执行的外部程序和启动参数、环境变量、工作目录作为参数传递给exec方法,该方法执行后返回一个Process代表所执行的程序。Runtime有六个exec方法,其中两个的定义为:publicProcessexec(String[]cmdarray,String[]envp,Filedir)publicProcessexec(Stringcommand,String[]envp,Filedir)cmdarray和command为要执行的命令,可以将命令和参数作为一个字符串command传递给exec()方法,也可以将命令和参数一个一个的方在数组cmdarray里传递给exec()方法。envp为环境变量,以name=value的形式放在数组中。dir为工作目录。可以不要dir参数,或者不要envp和dir参数,这样就多出了其它4个exec()方法。如果没有dir参数或者为null,那么新启动的进程就继承当前java进程的工作目录。如果没有envp参数或者为null,那么新启动的进程就继承当前java进程的环境变量。也可以使用ProcessBuilder类启动一个新的程序,该类是后来添加到JDK中的,而且被推荐使用。通过构造函数设置要执行的命令以及参数,或者也可以通过command()方法获取命令信息后在进行设置。通过directory(Filedirectory)方法设置工作目录,通过environment()获取环境变量信息来修改环境变量。在使用ProcessBuilder构造函数创建一个新实例,设置环境变量、工作目录后,可以通过start()方法来启动新程序,与Runtime的exec()方法一样,该方法返回一个Process对象代表启动的程序。ProcessBuilder与Runtime.exec()方法的不同在于ProcessBuilder提供了redirectErrorStream(booleanredirectErrorStream)方法,该方法用来将进程的错误输出重定向到标准输出里。即可以将错误输出都将与标准输出合并。2、Process不管通过那种方法启动进程后,都会返回一个Process类的实例代表启动的进程,该实例可用来控制进程并获得相关信息。Process类提供了执行从进程输入、执行输出到进程、等待进程完成、检查进程的退出状态以及销毁(杀掉)进程的方法:(1)voiddestroy()杀掉子进程。一般情况下,该方法并不能杀掉已经启动的进程,不用为好。(2)intexitValue()返回子进程的出口值。只有启动的进程执行完成、或者由于异常退出后,exitValue()方法才会有正常的返回值,否则抛出异常。(3)InputStreamgetErrorStream()获取子进程的错误流。如果错误输出被重定向,则不能从该流中读取错误输出。(4)InputStreamgetInputStream()获取子进程的输入流。可以从该流中读取进程的标准输出。(5)OutputStreamgetOutputStream()获取子进程的输出流。写入到该流中的数据作为进程的标准输入。(6)intwaitFor()导致当前线程等待,如有必要,一直要等到由该Process对象表示的进程已经终止。通过该类提供的方法,可以实现与启动的进程之间通信,达到交互的目的。3、从标准输出和错误输出流读取信息从启动其他程序的Java进程看,已启动的其他程序输出就是一个普通的输入流,可以通过getInputStream()和getErrorStream来获取。对于一般输出文本的进程来说,可以将InputStream封装成BufferedReader,然后就可以一行一行的对进程的标准输出进行处理。4、举例(1)Runtime.exec()importjava.io.BufferedReader;importjava.io.File;importjava.io.InputStreamReader;publicclassTest1{publicstaticvoidmain(String[]args){try{Processp=null;Stringline=null;BufferedReaderstdout=null;//:\p=Runtime.getRuntime().exec("CMD.exe/Cdir",null,newFile("C:\\"));stdout=newBufferedReader(newInputStreamReader(p.getInputStream()));while((line=stdout.readLine())!=null){System.out.println(line);}stdout.close();//echothevalueofNAMEp=Runtime.getRuntime().exec("CMD.exe/Cecho%NAME%",newString[]{"NAME=TEST"});stdout=newBufferedReader(newInputStreamReader(p.getInputStream()));while((line=stdout.readLine())!=null){System.out.println(line);}stdout.close();}catch(Exceptione){e.printStackTrace();}}(2)ProcessBuilderimportjava.io.BufferedReader;importjava.io.File;importjava.io.InputStreamReader;importjava.util.ArrayList;importjava.util.List;publicclassTest2{publicstaticvoidmain(String[]args){try{Listlist=newArrayList();ProcessBuilderpb=null;Processp=null;Stringline=null;BufferedReaderstdout=null;//:\list.add("CMD.EXE");list.add("/C");list.add("dir");pb=newProcessBuilder(list);pb.directory(newFile("C:\\"));p=pb.start();stdout=newBufferedReader(newInputStreamReader(p.getInputStream()));while((line=stdout.readLine())!=null){System.out.println(line);}stdout.close();//echothevalueofNAMEpb=newProcessBuilder();mand(newString[]{"CMD.exe","/C","echo%NAME%"});pb.environment().put("NAME","TEST");p=pb.start();stdout=newBufferedReader(newInputStreamReader(p.getInputStream()));while((line=stdout.readLine())!=null){System.out.println(line);}stdout.close();}catch(Exceptione){e.printStackTrace();}}}5、获取进程的返回值通常,一个程序/进程在执行结束后会向操作系统返回一个整数值,0一般代表执行成功,非0表示执行出现问题。有两种方式可以用来获取进程的返回值。一是利用waitFor(),该方法是阻塞的,执导进程执行完成后再返回。该方法返回一个代表进程返回值的整数值。另一个方法是调用exitValue()方法,该方法是非阻塞的,调用立即返回。但是如果进程没有执行完成,则抛出异常。6、阻塞的问题由Process代表的进程在某些平台上有时候并不能很好的工作,特别是在对代表进程的标准输入流、输出流和错误输出进行操作时,如果使用不慎,有可能导致进程阻塞,甚至死锁。如果将以上事例中的从标准输出重读取信息的语句修改为从错误输出流中读取:stdout=newBufferedReader(newInputStreamReader(p.getErrorStream()));那么程序将发生阻塞,不能执行完成,而是hang在那里。当进程启动后,就会打开标准输出流和错误输出流准备输出,当进程结束时,就会关闭他们。在以上例子中,错误输出流没有数据要输出,标准输出流中有数据输出。由于标准输出流中的数据没有被读取,进程就不会结束,错误输出流也就不会被关闭,因此在调用readLine()方法时,整个程序就会被阻塞。为了解决这个问题,可以根据输出的实际先后,先读取标准输出流,然后读取错误输出流。但是,很多时候不能很明确的知道输出的先后,特别是要操作标准输入的时候,情况就会更为复杂。这时候可以采用线程来对标准输出、错误输出和标准输入进行分别处理,根据他们之间在业务逻辑上的关系决定读取那个流或者写入数据。针对标准输出流和错误输出流所造成的问题,可以使用ProcessBuilder的redirectErrorStream()方法将他们合二为一,这时候只要读取标准输出的数据就可以了。当在程序中使用Process的waitFor()方法时,特别是在读取之前调用waitFor()方法时,也有可能造成阻塞。可以用线程的方法来解决这个问题,也可以在读取数据后,调用waitFor()方法等待程序结束。总之,解决阻塞的方法应该有两种:(1)使用ProcessBuilder类,利用redirectErrorStream方法将标准输出流和错误输出流合二为一,在用start()方法启动进程后,先从标准输出中读取数据,然后调用waitFor()方法等待进程结束。如:importjava.io.BufferedReader;importjava.io.File;importjava.io.InputStreamReader;importjava.util.ArrayList;importjava.util.List;publicclassTest3{publicstaticvoidmain(String[]args){try{Listlist=newArrayList();ProcessBuilderpb=null;Processp=null;Stringline=null;BufferedReaderstdout=null;//:\list.add("CMD.EXE");list.add("/C");list.add("dir");pb=newProcessBuilder(list);pb.directory(newFile("C:\\"));//.redirectErrorStream(true);p=pb.start();//readthestandardoutputstdout=newBufferedReader(newInputStreamReader(p.getInputStream()));while((line=stdout.readLine())!=null){System.out.println(line);}intret=p.waitFor();System.out.println("thereturncodeis"+ret);stdout.close();}catch(Exceptione){e.printStackTrace();}}}(2)使用线程importjava.util.*;importjava.io.*;classStreamWatchextendsThread{InputStreamis;Stringtype;Listoutput=newArrayList();booleandebug=false;StreamWatch(InputStreamis,Stringtype){this(is,type,false);}StreamWatch(InputStreamis,Stringtype,booleandebug){this.is=is;this.type=type;this.debug=debug;}publicvoidrun(){try{PrintWriterpw=null;InputStreamReaderisr=newInputStreamReader(is);BufferedReaderbr=newBufferedReader(isr);Stringline=null;while((line=br.readLine())!=null){output.add(line);if(debug)System.out.println(type+">"+line);}if(pw!=null)pw.flush();}catch(IOExceptionioe){ioe.printStackTrace();}}publicListgetOutput(){returnoutput;}}publicclassTest5{publicstaticvoidmain(Stringargs[]){try{Listlist=newArrayList();ProcessBuilderpb=null;Processp=null;//:\list.add("CMD.EXE");list.add("/C");list.add("dir");pb=newProcessBuilder(list);pb.directory(newFile("C:\\"));p=pb.start();//=newStreamWatch(p.getErrorStream(),"ERROR");StreamWatchoutputWatch=newStreamWatch(p.getInputStream(),"OUTPUT");//starttowatcherrorWatch.start();outputWatch.start();//waitforexitintexitVal=p.waitFor();//.out.println("ERROR:"+errorWatch.getOutput());System.out.println("OUTPUT:"+outputWatch.getOutput());System.out.println("thereturncodeis"+exitVal);}catch(Throwablet){t.printStackTrace();}}}7、在Java中执行Java程序执行一个Java程序的关键在于:(1)知道JAVA虚拟机的位置,即java.exe或者java的路径(2)知道要执行的java程序的位置(3)知道该程序所依赖的其他类的位置举一个例子,一目了然。(1)待执行的Java类publicclassMyTest{publicstaticvoidmain(String[]args){System.out.println("OUTPUTone");System.out.println("OUTPUTtwo");System.err.println("ERROR1");System.err.println("ERROR2");for(inti=0;i"+line);}if(pw!=null)pw.flush();}catch(IOExceptionioe){ioe.printStackTrace();}}publicListgetOutput(){returnoutput;}}publicclassTest6{publicstaticvoidmain(Stringargs[]){try{Listlist=newArrayList();ProcessBuilderpb=null;Processp=null;Stringjava=System.getProperty("java.home")+File.separator+"bin"+File.separator+"java";Stringclasspath=System.getProperty("java.class.path");//:\list.add(java);list.add("-classpath");list.add(classpath);list.add(MyTest.class.getName());list.add("hello");list.add("world");list.add("goodbetterbest");pb=newProcessBuilder(list);p=pb.start();System.out.println(mand());//=newStreamWatch(p.getErrorStream(),"ERROR");StreamWatchoutputWatch=newStreamWatch(p.getInputStream(),"OUTPUT");//starttowatcherrorWatch.start();outputWatch.start();//waitforexitintexitVal=p.waitFor();//.out.println("ERROR:"+errorWatch.getOutput());System.out.println("OUTPUT:"+outputWatch.getOutput());System.out.println("thereturncodeis"+exitVal);}catch(Throwablet){t.printStackTrace();}}}

‘贰’ 操作系统进程创建设计(用C语言完成)

http://www.ddvip.net/program/c/index2/26.htm
Linux下C语言编程--进程的创建

‘叁’ linux系统是怎样创建进程的以及首次调用新创建进程是,其入口在哪

linux
系统创建进程都是用
fork()
系统调用创建子进程

fork()
系统调用创建的新进程被称为子进程。该函数被调用一次,但返回两次。如果
fork()进程调用成功,两次返回的区别是子进程的返回值是0,而父进程的返回值则是新子进程的进程号

‘肆’ 操作系统创建新进程需要哪些参数

平时常见的XP最基本的系统进程(也就是说,这些进程是系统运行的基本条件,有了这些进程,系统就能正常运行) ,如果你装了其它程序如:360等会多

smss.exe Session Manager

csrss.exe 子系统服务器进程

winlogon.exe 管理用户登录

services.exe 包含很多系统服务

lsass.exe 管理 IP 安全策略以及启动 ISAKMP/Oakley (IKE) 和 IP 安全驱动程序。

(系统服务)

产生会话密钥以及授予用于交互式客户/服务器验证的服务凭据(ticket)。(系统服务)

svchost.exe 包含很多系统服务

svchost.exe

SPOOLSV.EXE 将文件加载到内存中以便迟后打印。(系统服务)

explorer.exe 资源管理器

internat.exe 托盘区的拼音图标

附加的系统进程(这些进程不是必要的,你可以根据需要通过服务管理器来增加或减少)

mstask.exe 允许程序在指定时间运行。(系统服务)

regsvc.exe 允许远程注册表操作。(系统服务)

winmgmt.exe 提供系统管理信息(系统服务)。

inetinfo.exe 通过 Internet 信息服务的管理单元提供 FTP 连接和管理。(系统服务)

tlntsvr.exe 允许远程用户登录到系统并且使用命令行运行控制台程序。(系统服务)

允许通过 Internet 信息服务的管理单元管理 Web 和 FTP 服务。(系统服务)

tftpd.exe 实现 TFTP Internet 标准。该标准不要求用户名和密码。远程安装服务的一部分。(系统服务)

termsrv.exe 提供多会话环境允许客户端设备访问虚拟的 Windows 2000Professional 桌面会话以及运行在服务器上的基于 Windows 的程序。(系统服务)

dns.exe 应答对域名系统(DNS)名称的查询和更新请求。(系统服务)

以下服务很少会用到,上面的服务都对安全有害,如果不是必要的应该关掉

tcpsvcs.exe 提供在 PXE 可远程启动客户计算机上远程安装 Windows 2000Professional 的能力。(系统服务)

支持以下 TCP/IP 服务:Character Generator, Daytime, Discard, Echo, 以及Quote of the Day。(系统服务)

ismserv.exe 允许在 Windows Advanced Server 站点间发送和接收消息。(系统服务)

ups.exe 管理连接到计算机的不间断电源(UPS)。(系统服务)

wins.exe 为注册和解析 NetBIOS 型名称的 TCP/IP 客户提供 NetBIOS 名称服务。

(系统服务)

llssrv.exe License Logging Service(system service)

ntfrs.exe 在多个服务器间维护文件目录内容的文件同步。(系统服务)

RsSub.exe 控制用来远程储存数据的媒体。(系统服务)

locator.exe 管理 RPC 名称服务数据库。(系统服务)

lserver.exe 注册客户端许可证。(系统服务)

dfssvc.exe 管理分布于局域网或广域网的逻辑卷。(系统服务)

clipsrv.exe 支持“剪贴簿查看器”,以便可以从远程剪贴簿查阅剪贴页面。(系统服务)

msdtc.exe 并列事务,是分布于两个以上的数据库,消息队列,文件系统,或其它事务保护资源管理器。(系统服务)

faxsvc.exe 帮助您发送和接收传真。(系统服务)

cisvc.exe Indexing Service(system service)

dmadmin.exe 磁盘管理请求的系统管理服务。(系统服务)

mnmsrvc.exe 允许有权限的用户使用 NetMeeting 远程访问 Windows 桌面。(系统服务)

netdde.exe 提供动态数据交换 (DDE) 的网络传输和安全特性。(系统服务)

smlogsvc.exe 配置性能日志和警报。(系统服务)

rsvp.exe 为依赖质量服务(QoS)的程序和控制应用程序提供网络信号和本地通信控制安装功能。(系统服务)

RsEng.exe 协调用来储存不常用数据的服务和管理工具。(系统服务)

RsFsa.exe 管理远程储存的文件的操作。(系统服务)

grovel.exe 扫描零备份存储(SIS)卷上的重复文件,并且将重复文件指向一个数据存储点,以节省磁盘空间。(系统服务)

SCardSvr.exe 对插入在计算机智能卡阅读器中的智能卡进行管理和访问控制。(系统服务)

snmp.exe 包含代理程序可以监视网络设备的活动并且向网络控制台工作站汇报。(系统服务)

snmptrap.exe 接收由本地或远程 SNMP 代理程序产生的陷阱消息,然后将消息传递到运行在这台计算机上 SNMP 管理程序。(系统服务)

UtilMan.exe 从一个窗口中启动和配置辅助工具。(系统服务)

msiexec.exe 依据 .MSI 文件中包含的命令来安装、修复以及删除软件。(系统服务)

‘伍’ Linux系统如何创建一个新进程进行

要是程序里fork()和vfork都是创建子进程

‘陆’ linux是怎样创建进程的

这个说起来太复杂了。不是一句两句的。LINUX创建进程和WINDOWS创建进程机制很大程度上是相同的。不同点在于。内核对信息处理次序优先级会发生歧义。一般都是输入系统发出信息后,通过总线送到CPU处理,这是CPU就会给预处理和正在处理的数据编号。形成一个进程。然后再通过总线将数据传回到输出系统。这个真不是一句两句能说明白的。恐怕我一晚上也解释不明白。要想很好的理解,就不要去管什么操作系统了。所有操作系统都一样。直接看微机组成原理吧!网上很多电子书。你把这块懂了。相信以后的汇编编程也就好弄点。
祝你好运。

‘柒’ 在linux系统下 ,怎么创建进程啊

linux 系统创建进程都是用 fork() 系统调用创建子进程由 fork() 系统调用创建的新进程被称为子进程。该函数被调用一次,但返回两次。如果 fork()进程调用成功,两次返回的区别是子进程的返回值是0,而父进程的返回值则是新子进程的进程号

‘捌’ win7下如何创建系统进程

1、进程分析: Mirosoft Windows 桌面搜索过滤器程序,一般不会自动增加, SearchFilterHost.exe 也可能是恶意软件所伪装,尤其是当它们存在于 c:\windows 或 c:\windows\system32 目录。建议使用 Security Task Manager 来检查电脑的安全状况,以便进一步查看 SearchFilterHost.exe 进程是否真的有害。 2、用360安全卫士清理垃圾、清理插件、杀除木马,最后再杀杀毒。