青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

PIGWORLD

學(xué)無止境

1.6 程序和進(jìn)程

1.6 程序和進(jìn)程

程序

程序是存在于磁盤上目錄中的可執(zhí)行文件。6exec函數(shù)中的任意一個,都可以將一個程序讀入內(nèi)存中并由內(nèi)核執(zhí)行(感覺這句沒有翻譯好,原句是: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

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

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

例子

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

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

$ ./a.out

hello world from process ID 851

$ ./a.out

hello world from process ID 854

該程序運(yùn)行時調(diào)用getpid函數(shù)來獲得進(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)程控制主要使用三個函數(shù):fork,execwaitpid。(exec函數(shù)有6個變體,我們通常把它們統(tǒng)稱為exec函數(shù)。)

例子

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

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

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

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

l         在子進(jìn)程中,調(diào)用execlp來執(zhí)行從標(biāo)準(zhǔn)輸入讀取的命令。這就把子進(jìn)程替換為一個新的程序文件。fork函數(shù)后跟exec函數(shù)的組合,就是一些操作系統(tǒng)所謂的產(chǎn)生一個新進(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ù)。第八章中將會介紹更多這方面的內(nèi)容。

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

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

運(yùn)行這個程序,我們得到下面的輸出。注意我們的程序有一個不同的提示符,使用百分號(%)來區(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í)行它們

 

符號^D用代表一個控制字符??刂谱址且环N特殊的的字符,可以通過同時按下控制鍵(在你的計(jì)算機(jī)上通常為Control鍵或Ctrl鍵)和另一個鍵來產(chǎn)生它。Control-D,或者說^D,是默認(rèn)的文件終止符。在18章討論終止I/O的時候會看到更多的控制字符。

線程和線程ID

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

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

和進(jìn)程一樣,線程由線程ID標(biāo)識。盡管如此,線程ID對于進(jìn)程ID來說是本地的。也就是說,一個進(jìn)程中的線程ID在另一個進(jìn)程中是沒有意義的。當(dāng)我們在進(jìn)程中操作線程的時候,使用線程ID來指出特定的線程。

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

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

Feedback

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

ok  回復(fù)  更多評論   


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久这里有精品15一区二区三区| 午夜久久久久久| 欧美一区三区二区在线观看| 欧美激情精品久久久久久| 亚洲国产精品久久久久久女王| 国产午夜精品久久久久久免费视| 久久九九精品99国产精品| 亚洲伊人一本大道中文字幕| 国产精品视频久久一区| 欧美视频一区在线观看| 欧美性事在线| 国产精品视频yy9099| 国产日产欧产精品推荐色| 国产日韩精品在线观看| 在线观看视频一区二区欧美日韩| 91久久午夜| 亚洲女人天堂成人av在线| 久久精品人人| 欧美激情在线狂野欧美精品| 日韩一区二区精品葵司在线| 午夜精品久久久久久久久| 久久全国免费视频| 欧美日韩亚洲综合在线| 国产视频亚洲精品| 亚洲精品一区二区三区福利| 欧美亚洲自偷自偷| 欧美福利视频一区| 亚洲神马久久| 久久午夜视频| 国产精品久久影院| 最近中文字幕日韩精品| 午夜精品成人在线| 欧美成人tv| 午夜精品久久久| 欧美精品一区在线播放| 国产亚洲综合在线| 亚洲素人在线| 亚洲国产日韩欧美| 久久精品一区二区| 国产精品视频不卡| 亚洲一级黄色av| 欧美**人妖| 欧美一区二区三区免费大片| 亚洲人屁股眼子交8| 亚洲欧美成人一区二区在线电影| 免费亚洲视频| 一区二区在线看| 西西裸体人体做爰大胆久久久| 欧美精品在线看| 国产一区二区久久| 91久久黄色| 久久精品欧美日韩| 亚洲午夜电影在线观看| 可以看av的网站久久看| 国产精品自在线| 亚洲天堂免费在线观看视频| 亚洲国产精品国自产拍av秋霞| 亚洲网站视频| 亚洲国产欧美在线| 久久精品国产91精品亚洲| 欧美日韩综合在线| 国产精品美女主播在线观看纯欲| 亚洲级视频在线观看免费1级| 久久久视频精品| 欧美一区二区日韩一区二区| 国产毛片一区二区| 久久成人免费| 久久成人免费日本黄色| 国产欧美亚洲日本| 欧美专区中文字幕| 欧美亚洲综合另类| 国产视频在线一区二区| 久久久www免费人成黑人精品 | 久久久久久久网站| 欧美一区二区三区另类 | 国产日韩一区二区三区| 欧美一级黄色网| 欧美一区二区三区久久精品茉莉花| 国产色爱av资源综合区| 久久国产精品亚洲va麻豆| 欧美一区二区免费| 亚洲电影免费在线观看| 91久久久在线| 国产精品男人爽免费视频1| 久久精品国产一区二区电影 | 中文网丁香综合网| 国产乱码精品一区二区三区忘忧草 | 亚洲丰满在线| 欧美日韩综合视频网址| 久久精品国产视频| 蜜桃久久av一区| 午夜精品久久久久久99热| 久久国内精品视频| 久久精品99| 欧美日韩在线免费| 久久riav二区三区| 欧美1区视频| 欧美亚洲一区二区三区| 欧美成人国产一区二区| 亚洲一区日韩在线| 久久婷婷麻豆| 亚洲欧美一区在线| 欧美va天堂| 欧美在线一二三四区| 能在线观看的日韩av| 午夜精品国产更新| 久久一区二区精品| 亚洲综合日韩在线| 美女精品视频一区| 欧美视频中文一区二区三区在线观看 | 好男人免费精品视频| 欧美成人xxx| 欧美日韩精品一区二区在线播放 | 日韩视频精品| 亚洲电影免费| 国产精品久久国产精品99gif| 欧美在线看片a免费观看| 亚洲永久精品大片| 亚洲国产精彩中文乱码av在线播放| 亚洲人精品午夜在线观看| 国产区在线观看成人精品| 免费久久99精品国产自| 欧美日韩在线影院| 久久久91精品国产一区二区精品| 欧美成人免费播放| 久久国产精品免费一区| 欧美日韩国产成人在线91| 欧美一区二区成人6969| 久久视频精品在线| 亚洲三级毛片| 欧美成人a视频| 久久激情视频久久| 欧美日韩精品国产| 欧美v亚洲v综合ⅴ国产v| 国产精品久久久久久模特| 久久www成人_看片免费不卡| 国产精品网红福利| 亚洲精品日本| 在线观看日韩av电影| 性久久久久久久久| 亚洲性图久久| 欧美激情日韩| 日韩午夜免费视频| 亚洲国产99| 久久国产精品久久w女人spa| 中国成人黄色视屏| 欧美96在线丨欧| 翔田千里一区二区| 国产一区二区三区黄视频| 一区二区av在线| 亚洲毛片在线| 欧美电影免费观看| 亚洲女人天堂av| 国产综合久久久久久鬼色| 欧美高清在线视频观看不卡| 欧美亚洲一区三区| 亚洲午夜国产成人av电影男同| 免费国产自线拍一欧美视频| 欧美一区二区在线免费播放| 亚洲精品一线二线三线无人区| 国产麻豆视频精品| 欧美区一区二| 国产一区二区主播在线| 欧美尤物巨大精品爽| 亚洲欧美视频在线观看| 国产精品国产亚洲精品看不卡15 | 亚洲免费福利视频| 麻豆国产精品777777在线| 久久精品一区二区三区中文字幕| 欧美午夜片在线观看| 亚洲免费观看高清在线观看| 亚洲精品综合| 欧美日韩精品在线观看| 日韩网站在线观看| 亚洲综合电影| 国产欧美日韩另类视频免费观看| 亚洲一区三区电影在线观看| 午夜伦理片一区| 国产一区二区你懂的| 欧美激情综合五月色丁香| 亚洲精品久久久久久久久久久| 一区二区国产精品| 国产精品激情| 欧美成人精品一区| 欧美激情视频给我| 欧美一区二区精品久久911| 久久国产主播| 亚洲国产精品小视频| 欧美区视频在线观看| 亚洲午夜一区二区三区| 久久精品最新地址| 午夜久久福利| 亚洲片在线资源| 国产精品伦子伦免费视频| 欧美成人黑人xx视频免费观看| 日韩亚洲视频在线| 亚洲国产成人一区| 欧美一区二区在线视频| 亚洲激情电影在线| 国产精品捆绑调教|