亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 操作系統 > 正文

進程控制之system函數

2024-06-28 13:28:33
字體:
來源:轉載
供稿:網友
進程控制之system函數

ISO C定義了system函數,但是其操作對系統的依賴性很強。POSIX.1包括了system接口,它擴展了ISO C定義,以描述system在POSIX.1環境中的運行行為。

#include <stdlib.h>int system( const char *cmdstring );

如果cmdstring是一個空指針,則僅當命令處理程序可用時,system返回非0值,這一特征可以確定在一個給定的操作系統上是否支持system函數。在UNIX中,system總是可用的。

因為system在其實現中調用了fork、exec和waitpid,因此有三種返回值:

(1)如果fork失敗或者waitpid返回除EINTR之外的出錯,則system返回-1,并且在errno中設置相應的錯誤類型值。

(2)如果exec失?。ū硎静荒軋绦衧hell),則其返回值如同shell執行了exit(127)一樣。

(3)否則所有三個函數(fork、exec和waitpid)都執行成功,并且system的返回值是shell的終止狀態,其格式已在waipid中說明(參見http://www.CUOXin.com/nufangrensheng/p/3510101.html)。

程序清單8-12 system函數(沒有信號處理)

[root@localhost apue]# cat system_nosighandling.c#include <sys/wait.h>#include <errno.h>#include <unistd.h>intsystem(const char *cmdstring)   /* version without signal handling */{        pid_t   pid;        int     status;        if (cmdstring == NULL)                return(1);      /* always a command PRocessor with UNIX */        if ((pid = fork()) < 0)        {                status = -1;    /* probably out of processes */        }        else if (pid == 0)      /* child */        {               /*                *  execl("/bin/sh", "sh", "-c", cmdstring, (char *)0);                * _exit(127);     /* execl error */                 * 此處程序原來是如上面所示,但我無法理解這里的邏輯(感覺是有問題的,但是執行也可獲得正確結果)                   * 改為了下面的形式                   */                if (execl("/bin/sh", "sh", "-c", cmdstring, (char *)0) < 0)                {                        _exit(127);     /* execl error */                            }        }        else                    /* parent */        {                while (waitpid(pid, &status, 0) < 0)                {                        if (errno != EINTR)                        {                                status = -1; /* error other than EINTR from waitpid() */                                break;                        }                }        }        return(status);}

shell的-c選項告訴shell程序取下一個命令行參數(在這里是cmdstring)作為命令輸入(而不是標準輸入或從一個給定的文件中讀命令)。shell對以null字符終止的命令字符串進行語法分析,將它們分成命令行參數(如果不使用shell執行此命令,而是試圖由我們自己去執行它,那么將相當困難。傳遞給shell的實際命令字符串可以包含任一有效的shell命令。

注意,我們調用_exit而不是exit。這是為了防止任一標準I/O緩沖區(這些緩沖區會在fork中由父進程復制給子進程,詳情請參考:http://www.CUOXin.com/nufangrensheng/p/3509492.html)在子進程中被沖洗。

程序清單8-13 調用system函數

[root@localhost apue]# cat prog8-13.c#include "apue.h"#include <sys/wait.h>intmain(void){        int     status;        if ((status = system("date")) < 0)                err_sys("system() error");        pr_exit(status);        if ((status = system("nosuchcommand")) < 0)                err_sys("system() error");        pr_exit(status);        if ((status = system("who; exit 44")) < 0)                err_sys("system() error");        pr_exit(status);        exit(0);}

運行程序清單8-13得到:

[root@localhost apue]# ./prog8-13Wed Jan  8 23:06:53 PST 2014normal termination, exit status = 0             對于datesh: nosuchcommand: command not foundnormal termination, exit status = 127           對于無此種命令root     pts/0        2014-01-03 22:57 (:0.0)normal termination, exit status = 44            對于exit

使用system而不是直接使用fork和exec的優點是:system進行了所需的各種出錯處理,以及各種信號處理(在帶信號處理的system版本中)。

 

設置用戶ID程序

如果在一個設置用戶ID程序中調用system,那么會發生什么呢?這是一個安全性方面的漏洞,決不應當這樣做。

如果一個進程正以特殊的權限(設置用戶ID或設置組ID)運行,它又想生成另一個進程執行另一個程序,則它應當直接使用fork和exec,而且在fork之后、exec之前要改回到普通權限。設置用戶ID或設置組ID程序決不應調用system函數。

 

本篇博文內容摘自《UNIX環境高級編程》(第二版),僅作個人學習記錄所用。關于本書可參考:http://www.apuebook.com/。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
一区二区三区在线播放欧美| 欧美日韩国产一中文字不卡| 午夜精品三级视频福利| 美女999久久久精品视频| 久久高清视频免费| 亚洲第一福利在线观看| 国产精品jvid在线观看蜜臀| 午夜精品福利电影| 久久久亚洲影院| 久久精品国产亚洲精品2020| 亚洲少妇中文在线| 538国产精品一区二区免费视频| 日韩国产中文字幕| 成人h片在线播放免费网站| 日韩欧美在线观看| 国产精品久久色| 欧美亚洲午夜视频在线观看| 欧美第一页在线| 亚洲福利在线视频| 欧美老女人xx| 国产精品va在线播放| 亚洲国产精品字幕| 成人性生交大片免费观看嘿嘿视频| 久久精品国产96久久久香蕉| 夜夜嗨av一区二区三区四区| 欧美激情在线一区| 亚洲在线www| 亚洲天堂一区二区三区| 国产视频久久网| 岛国av一区二区| 亚洲成人久久一区| 中文字幕日韩视频| 国产精品高清在线观看| 欧美激情性做爰免费视频| 久久综合亚洲社区| 热久久99这里有精品| 97人洗澡人人免费公开视频碰碰碰| 亚洲伊人成综合成人网| 国产精品欧美久久久| 国产免费一区视频观看免费| 91精品国产91久久久| 最近中文字幕mv在线一区二区三区四区| 国产精品v片在线观看不卡| 欧美性videos高清精品| 久久久免费观看视频| 精品久久久久久久久国产字幕| 在线日韩中文字幕| 97超碰蝌蚪网人人做人人爽| 亚洲国产精品美女| 97精品国产97久久久久久春色| 国产美女久久精品香蕉69| 成人免费观看49www在线观看| 在线播放日韩专区| 欧美精品在线视频观看| 91久久精品国产| 亚洲男人av在线| 国产精品69av| 国产精品国产自产拍高清av水多| 日韩一区二区在线视频| 久久久久久九九九| 亚洲最大的免费| 国产成人精品久久亚洲高清不卡| 视频在线一区二区| 欧美日韩国产精品一区| 91精品国产91久久久久久最新| 久久久91精品| 青青精品视频播放| 九色91av视频| 久久久久久久网站| 亚洲tv在线观看| 日韩av在线看| 欧美日韩成人在线观看| 欧美大片网站在线观看| 久热爱精品视频线路一| 国产精品视频不卡| 亚洲精美色品网站| 亚州成人av在线| 亚洲精品v欧美精品v日韩精品| 国产精品一久久香蕉国产线看观看| 国产精品免费久久久| 91性高湖久久久久久久久_久久99| 少妇精69xxtheporn| 国产精品一区二区三区成人| 国产精品欧美在线| 全亚洲最色的网站在线观看| 久久天天躁狠狠躁夜夜躁2014| 久久人体大胆视频| 欧美一区三区三区高中清蜜桃| 91天堂在线观看| 亚洲香蕉伊综合在人在线视看| 国产成人精品在线视频| 国产一区二区三区四区福利| 成人h片在线播放免费网站| 热99精品只有里视频精品| 久久久久久久久久久免费精品| 亚洲理论在线a中文字幕| 97香蕉久久夜色精品国产| 欧美小视频在线| 日韩欧美在线字幕| 视频一区视频二区国产精品| 欧美午夜视频在线观看| 欧美午夜影院在线视频| 日韩电影大全免费观看2023年上| 国产精品久久久久久久久久| 日韩欧美aⅴ综合网站发布| 亚洲综合大片69999| 国产999精品视频| 日韩中文字幕在线视频播放| 97精品国产91久久久久久| 国产精品xxx视频| 一区二区三区久久精品| 97碰碰碰免费色视频| 亚洲精品久久久久中文字幕二区| 黑人极品videos精品欧美裸| 91色在线视频| 538国产精品一区二区免费视频| 91精品国产91久久久久福利| 亚洲视频电影图片偷拍一区| 97在线视频免费看| 久久九九免费视频| 欧美多人爱爱视频网站| 日韩精品久久久久久福利| 久久国产精品亚洲| 欧美精品18videosex性欧美| 538国产精品一区二区免费视频| 欧美性猛交视频| 国产精品视频网| 亚洲一区二区精品| 亚洲伊人成综合成人网| 黑人巨大精品欧美一区二区三区| 亚洲天堂网在线观看| 欧美成人午夜激情视频| 日韩理论片久久| 色偷偷av一区二区三区乱| 国产精品久久久久久av福利软件| 亚洲精品小视频| 日韩一区二区三区国产| 国产有码在线一区二区视频| 欧美日韩999| 欧美亚洲在线视频| 久久亚洲精品中文字幕冲田杏梨| 2019中文字幕在线| 亚洲精品wwww| 欧美激情在线一区| 亚洲xxxx视频| 欧美最猛黑人xxxx黑人猛叫黄| 亚洲第一精品电影| 亚洲视频电影图片偷拍一区| 中文字幕v亚洲ⅴv天堂| 中文字幕精品—区二区| 亚洲a级在线播放观看| 亚洲视频自拍偷拍| 精品久久久久久久久中文字幕| 奇米一区二区三区四区久久| 九色91av视频| 国产精品久久久久久影视| 国产精品看片资源| 精品福利免费观看| 狠狠色狠色综合曰曰| 欧美成人午夜视频| 久久久国产成人精品| 亚洲午夜国产成人av电影男同| 青草成人免费视频| 日韩久久免费电影|