• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            PIGWORLD

            學(xué)無(wú)止境

            1.6 程序和進(jìn)程

            1.6 程序和進(jìn)程

            程序

            程序是存在于磁盤(pán)上目錄中的可執(zhí)行文件。6個(gè)exec函數(shù)中的任意一個(gè),都可以將一個(gè)程序讀入內(nèi)存中并由內(nèi)核執(zhí)行(感覺(jué)這句沒(méi)有翻譯好,原句是:A program is read into memory and is executed by the kernel as a result of one of the six exec functions.)。我們將在8.10節(jié)中介紹這些函數(shù)。

            進(jìn)程和進(jìn)程ID

            一個(gè)正在執(zhí)行中的程序?qū)嵗环Q為進(jìn)程(process),該詞語(yǔ)(進(jìn)程)幾乎會(huì)出現(xiàn)在本書(shū)中的每一頁(yè)。一些操作系統(tǒng)用任務(wù)(task)來(lái)稱呼一個(gè)正在運(yùn)行中的程序。

            UNIX系統(tǒng)確保每一個(gè)進(jìn)程都擁有一個(gè)唯一的數(shù)字標(biāo)識(shí)符,稱為進(jìn)程ID。進(jìn)程ID總是非負(fù)整數(shù)。

            例子

            1.6中的程序打印出它的進(jìn)程ID

            如果我們把程序編譯成a.out并執(zhí)行它,我們會(huì)看到

            $ ./a.out

            hello world from process ID 851

            $ ./a.out

            hello world from process ID 854

            該程序運(yùn)行時(shí)調(diào)用getpid函數(shù)來(lái)獲得進(jìn)程ID

            1 #include "apue.h"
            2 
            3 int
            4 main(void)
            5 {
            6     printf("hello world from process ID %d\n", getpid());
            7     exit(0);
            8 }

            1.6 打印進(jìn)程ID

            進(jìn)程控制

            進(jìn)程控制主要使用三個(gè)函數(shù):forkexecwaitpid。(exec函數(shù)有6個(gè)變體,我們通常把它們統(tǒng)稱為exec函數(shù)。)

            例子

            使用一個(gè)簡(jiǎn)單的程序(圖1.7)來(lái)展示UNIX系統(tǒng)的進(jìn)程控制特性,該程序從標(biāo)準(zhǔn)輸入讀取命令并且執(zhí)行這些命令。這是一個(gè)類似shell程序的本質(zhì)(翻譯得不好,原句是:This is a bare-bones implementation of a shell-like program.)。在這個(gè)30行的程序中有許多特性值得思考。

            l         使用標(biāo)準(zhǔn)I/O函數(shù)fgets,一次從標(biāo)準(zhǔn)輸入中讀取一行。當(dāng)輸入文件終止符(通常是Control-D)作為一行的第一個(gè)字符時(shí),fgets返回null指針,同時(shí)終止循環(huán),接著終止進(jìn)程。在18章中,我們描述所有特殊的終端字符(文件終止符,退格字符,整行擦除字符等等),并且介紹怎樣改變它們。

            l         fgets返回的每一行都終止于一個(gè)換行符和跟在換行符后面的一個(gè)null字節(jié),我們使用標(biāo)準(zhǔn)的C函數(shù)strlen來(lái)計(jì)算字符串的長(zhǎng)度,接著把換行符替換為一個(gè)null字節(jié)。這樣做是因?yàn)?/SPAN>execlp函數(shù)需要一個(gè)以null結(jié)束的參數(shù),而不是以換行符結(jié)束的參數(shù)。

            l         調(diào)用fork函數(shù)來(lái)建立一個(gè)進(jìn)程,這個(gè)進(jìn)程是一個(gè)調(diào)用者的拷貝。我們把調(diào)用者稱為父進(jìn)程,把新建立的進(jìn)程稱為子進(jìn)程。那么fork函數(shù)返回子進(jìn)程的非負(fù)進(jìn)程ID給父進(jìn)程,同時(shí)返回0給子進(jìn)程。因?yàn)?/SPAN>fork創(chuàng)建了一個(gè)新進(jìn)程,我們說(shuō)fork被調(diào)用一次就返回兩次,一次返回給父進(jìn)程,一次返回給子進(jìn)程。

            l         在子進(jìn)程中,調(diào)用execlp來(lái)執(zhí)行從標(biāo)準(zhǔn)輸入讀取的命令。這就把子進(jìn)程替換為一個(gè)新的程序文件。fork函數(shù)后跟exec函數(shù)的組合,就是一些操作系統(tǒng)所謂的產(chǎn)生一個(gè)新進(jìn)程。(翻譯得不好,原句是:This replaces the child process with the new program file. The combination of a fork, followed by an exec, is what some operating systems call spawning a new process.)在UNIX系統(tǒng)中,這兩部分被分為了獨(dú)立的函數(shù)。第八章中將會(huì)介紹更多這方面的內(nèi)容。

            l         因?yàn)樽舆M(jìn)程調(diào)用execlp來(lái)執(zhí)行新的程序文件,父進(jìn)程就會(huì)等待直到子進(jìn)程結(jié)束。這些工作由waitpid函數(shù)完成。waitpid函數(shù)中的pid參數(shù)代表了子進(jìn)程的進(jìn)程ID,該參數(shù)用來(lái)標(biāo)識(shí)出需要等待的進(jìn)程。waitpid函數(shù)也可以得到子進(jìn)程的終止?fàn)顟B(tài)。在這個(gè)簡(jiǎn)單程序中的的status變量就代表了子進(jìn)程的終止?fàn)顟B(tài),在程序中我們沒(méi)有使用這個(gè)值,但是我們可以通過(guò)檢查這個(gè)值來(lái)確定子進(jìn)程的終止?fàn)顟B(tài)。

            l         這個(gè)程序最根本的限制在于我們不能像我們所執(zhí)行的命令傳遞參數(shù)。例如,不能列舉特定的目錄。我們只可以在工作目錄執(zhí)行ls命令。為了能夠傳遞參數(shù),我們需要分析輸入行,按某種習(xí)慣(可能的情況是使用空格或者制表符)區(qū)別出參數(shù),接著把每一個(gè)參數(shù)作為獨(dú)立的參數(shù)傳遞給execlp函數(shù)。盡管如此,這個(gè)程序仍然對(duì)UNIX系統(tǒng)進(jìn)程控制函數(shù)進(jìn)行了有用說(shuō)明。

            運(yùn)行這個(gè)程序,我們得到下面的輸出。注意我們的程序有一個(gè)不同的提示符,使用百分號(hào)(%)來(lái)區(qū)別于shell的提示符。

            $ ./a.out

            % date

            Sun Aug 1 03:04:47 EDT 2004

            % who

            sar    :0        Jul 26 22:54

            sar    pts/0      Jul 26 22:54  (:0)

            sar    pts/1      Jul 26 22:54  (:0)

            sar    pts/2      Jul 26 22:54  (:0)

            % pwd

            /home/sar/bk/apue/2e

            % ls

            Makefile

            a.out

            shell1.c

            % ^D                           輸入文件終止符

            $                               shell提示符

             

            #include "apue.h"
            #include 
            <sys/wait.h>

            int
            main(
            void)
            {
                
            char    buf[MAXLINE];   /* from apue.h */
                pid_t   pid;
                
            int     status;

                printf(
            "%% ");  /* print prompt (printf requires %% to print %) */
                
            while (fgets(buf, MAXLINE, stdin) != NULL) {
                    
            if (buf[strlen(buf) - 1== '\n')
                        buf[strlen(buf) 
            - 1= 0/* replace newline with null */

                    
            if ((pid = fork()) < 0) {
                        err_sys(
            "fork error");
                    } 
            else if (pid == 0) {      /* child */
                        execlp(buf, buf, (
            char *)0);
                        err_ret(
            "couldn't execute: %s", buf);
                        exit(
            127);
                    }

                    
            /* parent */
                    
            if ((pid = waitpid(pid, &status, 0)) < 0)
                        err_sys(
            "waitpid error");
                    printf(
            "%% ");
                }
                exit(
            0);
            }

            1.7 從標(biāo)準(zhǔn)輸入讀取命令并執(zhí)行它們

             

            符號(hào)^D用代表一個(gè)控制字符。控制字符是一種特殊的的字符,可以通過(guò)同時(shí)按下控制鍵(在你的計(jì)算機(jī)上通常為Control鍵或Ctrl鍵)和另一個(gè)鍵來(lái)產(chǎn)生它。Control-D,或者說(shuō)^D,是默認(rèn)的文件終止符。在18章討論終止I/O的時(shí)候會(huì)看到更多的控制字符。

            線程和線程ID

            通常,一個(gè)進(jìn)程只有一個(gè)線程(原句是:Usually, a process has only one thread of control one set of machine instructions executing at a time.不知道怎么翻譯,留給大蝦翻譯)。當(dāng)有多于一個(gè)的線程來(lái)控制不同部分時(shí),一些問(wèn)題就變得很容易解決。另外,多線程在多處理器系統(tǒng)上能夠獲得平衡性(又一句翻譯得不爽:Additionally, multiple threads of control can exploit the parallelism possible on multiprocessor systems.)。

            一個(gè)進(jìn)程中的所有線程共享同一個(gè)地址空間,文件描述符,棧和進(jìn)程相關(guān)的屬性。因?yàn)槟軌蛟L問(wèn)相同的內(nèi)存,線程必須同步訪問(wèn)它們自己的共享數(shù)據(jù),以避免沖突。

            和進(jìn)程一樣,線程由線程ID標(biāo)識(shí)。盡管如此,線程ID對(duì)于進(jìn)程ID來(lái)說(shuō)是本地的。也就是說(shuō),一個(gè)進(jìn)程中的線程ID在另一個(gè)進(jìn)程中是沒(méi)有意義的。當(dāng)我們?cè)谶M(jìn)程中操作線程的時(shí)候,使用線程ID來(lái)指出特定的線程。

            控制線程的函數(shù)和控制進(jìn)程的函數(shù)是一樣的。在進(jìn)程模型建立很久以后,線程才被加入到UNIX系統(tǒng)中,然而,線程模型和進(jìn)程模型之間有一些復(fù)雜的交互,在12章將會(huì)看到這些。

            posted on 2006-01-06 00:25 PIGWORLD 閱讀(707) 評(píng)論(1)  編輯 收藏 引用 所屬分類: 《UNIX環(huán)境高級(jí)編程(第二版)》翻譯

            Feedback

            # re: 1.6 程序和進(jìn)程 2006-06-23 15:21 abc

            ok  回復(fù)  更多評(píng)論   


            色综合久久综精品| 青青青青久久精品国产h久久精品五福影院1421 | 久久久久国产精品| 久久777国产线看观看精品| 成人久久综合网| 久久久久一级精品亚洲国产成人综合AV区| 91精品国产综合久久四虎久久无码一级 | …久久精品99久久香蕉国产| 国产亚洲欧美成人久久片| 99精品国产在热久久| 久久久久国产精品麻豆AR影院 | 欧美无乱码久久久免费午夜一区二区三区中文字幕 | 久久综合九色综合97_久久久| 久久久99精品一区二区| 久久久精品一区二区三区| 亚洲精品高清国产一线久久 | 精品国产VA久久久久久久冰| 无码任你躁久久久久久| 精品国产婷婷久久久| 成人国内精品久久久久一区| 99精品久久久久久久婷婷| 久久精品综合一区二区三区| 久久久久久久尹人综合网亚洲| 狠狠色婷婷综合天天久久丁香| 国产成人久久精品区一区二区| 久久福利青草精品资源站免费| 精品国产乱码久久久久久1区2区| 久久精品一本到99热免费| 亚洲一本综合久久| 狠狠色婷婷久久一区二区| 99久久99这里只有免费费精品 | 精品久久久久中文字| 一本久久综合亚洲鲁鲁五月天亚洲欧美一区二区 | 久久久久久久波多野结衣高潮| 日韩精品久久久久久久电影蜜臀| 国产精品九九九久久九九| 欧美成人免费观看久久| 99久久久久| 中文字幕成人精品久久不卡| 色诱久久久久综合网ywww| 蜜桃麻豆www久久国产精品|