當前位置:首頁 » 手機資訊 » 系統是怎樣創建進程的
擴展閱讀
男性非淋原因有哪些 2024-10-23 05:12:55

系統是怎樣創建進程的

發布時間: 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安全衛士清理垃圾、清理插件、殺除木馬,最後再殺殺毒。