精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Linux system函數的正確應用和異常處理

系統 Linux
Linux系統中的system函數作為Linux應用開發工程師來說是一個非常方便的調用shell腳本的方法,但是不理解system函數本身的調用機制,不進行相應的出錯處理,很容易造成程序的異常和bug。

Linux系統中的system函數作為Linux應用開發工程師來說是一個非常方便的調用shell腳本的方法,但是不理解system函數本身的調用機制,不進行相應的出錯處理,很容易造成程序的異常和bug。

一、system()理解

功能:system()函數調用“/bin/sh -c command”執行特定的命令,阻塞當前進程直到command命令執行完畢

原型:

int system(const char *command);

返回值:

如果無法啟動shell運行命令,system將返回127;出現不能執行system調用的其他錯誤時返回-1。如果system能夠順利執行,返回那個命令的退出碼。

說明:

man幫助:

       #include <stdlib.h>

       int system(const char *command);

DESCRIPTION 

       system()  executes a command specified in command by calling /bin/sh -c 

       command, and returns after the command has been completed.  During exe- 

       cution  of the command, SIGCHLD will be blocked, and SIGINT and SIGQUIT 

       will be ignored.

RETURN VALUE 

       The value returned is -1 on  error  (e.g.   fork(2)  failed),  and  the 

       return  status  of the command otherwise.  This latter return status is 

       in the format specified in wait(2).  Thus, the exit code of the command 

       will  be  WEXITSTATUS(status).   In case /bin/sh could not be executed, 

       the exit status will be that of a command that does exit(127).

       If the value of command is NULL, system() returns non-zero if the shell 

       is available, and zero if not.

       system() does not affect the wait status of any other children.

二、system()函數原理

system函數執行時,會調用fork、execve、waitpid等函數。

Linux版system函數的源碼:

 

  1. int system(const char * cmdstring) 
  2.  { 
  3.      pid_t pid; 
  4.      int status; 
  5.      if(cmdstring == NULL){         
  6.           return (1); 
  7.      } 
  8.      if((pid = fork())<0){ 
  9.              status = -1; 
  10.      } 
  11.      else if(pid == 0){ 
  12.          execl("/bin/sh", "sh", "-c", cmdstring, (char *)0); 
  13.          _exit(127); //子進程正常執行則不會執行此語句 
  14.         } 
  15.      else{ 
  16.              while(waitpid(pid, &status, 0) < 0){ 
  17.                  if(errno != EINTER){ 
  18.                      status = -1; 
  19.                      break; 
  20.                  } 
  21.              } 
  22.          } 
  23.          return status; 
  24.  } 

 

函數說明 

system()會調用fork()產生子進程,由子進程來調用/bin/sh-c string來執行參數string字符串所代表的命令,此命>令執行完后隨即返回原調用的進程。 

在調用system()期間SIGCHLD 信號會被暫時擱置,SIGINT和SIGQUIT 信號則會被忽略。 

返回值 

=-1:出現錯誤  

=0:調用成功但是沒有出現子進程  

>0:成功退出的子進程的id 

如果system()在調用/bin/sh時失敗則返回127,其他失敗原因返回-1。若參數string為空指針(NULL),則返回非零值>。如果system()調用成功則最后會返回 

執行shell命令后的返回值,但是此返回值也有可能為 system()調用/bin/sh失敗所返回的127,因此最好能再檢查errno 來確認執行成功。 

附加說明 

在編寫具有SUID/SGID權限的程序時請勿使用system(),system()會繼承環境變量,通過環境變量可能會造成系統安全的問題。

system函數對返回值的處理,涉及3個階段:

階段1:創建子進程等準備工作。如果失敗,返回-1。 

階段2:調用/bin/sh拉起shell腳本,如果拉起失敗或者shell未正常執行結束(參見備注1),原因值被寫入到status的低8~15比特位中。system的man中只說明了會寫了127這個值,但實測發現還會寫126等值。 

階段3:如果shell腳本正常執行結束,將shell返回值填到status的低8~15比特位中。 

備注1: 

只要能夠調用到/bin/sh,并且執行shell過程中沒有被其他信號異常中斷,都算正常結束。 

比如:不管shell腳本中返回什么原因值,是0還是非0,都算正常執行結束。即使shell腳本不存在或沒有執行權限,也都算正常執行結束。 

如果shell腳本執行過程中被強制kill掉等情況則算異常結束。

如何判斷階段2中,shell腳本子進程是否正常執行結束呢?系統提供了宏:WIFEXITED(status)。如果WIFEXITED(status)為真,則說明正常結束。 

如何取得階段3中的shell返回值?你可以直接通過右移8bit來實現,但安全的做法是使用系統提供的宏:WEXITSTATUS(status)。

由于我們一般在shell腳本中會通過返回值判斷本腳本是否正常執行,如果成功返回0,失敗返回正數。 

所以綜上,判斷一個system函數調用shell腳本是否正常結束的方法應該是如下3個條件同時成立: 

(1)-1 != status 

(2)WIFEXITED(status)為真 

(3)0 == WEXITSTATUS(status) 

注意: 

根據以上分析,當shell腳本不存在、沒有執行權限等場景下時,以上前2個條件仍會成立,此時WEXITSTATUS(status)為127,126等數值。 

所以,我們在shell腳本中不能將127,126等數值定義為返回值,否則無法區分中是shell的返回值,還是調用shell腳本異常的原因值。shell腳本中的返回值最好多1開始遞增。

示例程序:

 

  1. #include <stdio.h> 
  2. #include <unistd.h> 
  3. #include <stdlib.h> 
  4.  
  5. #define EXIT_ERR(m) \ 
  6. do\ 
  7. {\ 
  8.     perror(m);\ 
  9.     exit(EXIT_FAILURE);\ 
  10. }\ 
  11. while (0);\ 
  12.   
  13. int main(void) 
  14.     int status ; 
  15.     status = system("ls -l|wc -l"); 
  16.   
  17.     if(status == -1){ 
  18.         EXIT_ERR("system error"); 
  19.     } 
  20.   
  21.     else{ 
  22.         if(WIFEXITED(status)) 
  23.         { 
  24.             if(WEXITSTATUS(status) == 0) 
  25.                 printf("run command successful\n"); 
  26.             else 
  27.                 printf("run command fail and exit code is %d\n",WEXITSTATUS(status)); 
  28.         } 
  29.         else 
  30.             printf("exit status = %d\n",WEXITSTATUS(status)); 
  31.     } 
  32.     return 0; 

 

運行結果:

 

責任編輯:奔跑的冰淇淋 來源: 嵌入式linux中文站
相關推薦

2010-05-25 18:01:35

linux MySQL

2010-05-28 15:16:40

MySQL 資源

2010-02-01 15:26:44

C++ inline函

2010-05-28 19:20:36

MySQL mysql

2009-12-07 14:38:14

PHP foreach

2010-08-16 10:10:27

DB2常用函數

2010-02-22 10:42:12

WCF Stream

2010-07-21 10:50:48

SQL Server存

2010-02-22 14:09:08

WCF Dispose

2021-07-02 16:13:01

區塊鏈金融數據庫

2010-07-05 14:34:19

2010-07-20 13:26:43

2010-07-26 16:11:45

Microsoft S

2010-02-05 17:49:24

C++常量引用

2010-07-26 17:43:34

SQL Server

2010-03-04 09:40:52

Python Clas

2010-03-04 13:30:11

Python file

2010-02-05 14:12:46

C++聲明放置

2010-08-11 15:48:04

DB2編程

2010-08-11 15:48:04

DB2編程
點贊
收藏

51CTO技術棧公眾號

日韩av免费| 日本电影一区二区在线观看| 欧美久久一区| 亚洲国产日韩一区| 国产视频在线视频| 国产高清一区二区三区视频| 成人福利电影精品一区二区在线观看| 青青草国产精品一区二区| 手机看片国产日韩| 果冻天美麻豆一区二区国产| 91黄色免费网站| 日本a在线天堂| 国产永久免费高清在线观看| 国产精品系列在线观看| 日韩美女免费观看| 欧美三级在线免费观看| 精品一区亚洲| 亚洲成色777777女色窝| 校园春色 亚洲色图| 国产在线拍揄自揄拍视频| 日本一区二区在线不卡| 国产精品视频入口| 97caocao| 天堂影院一区二区| 97久久国产精品| 婷婷伊人五月天| 精品国产一区二区三区久久久樱花 | 中文字幕免费在线观看视频| 亚洲国产一成人久久精品| 亚洲欧美日韩国产成人| 超碰caoprom| 日韩视频1区| 欧美二区在线观看| 精品久久久久久久无码| 精品众筹模特私拍视频| 亚洲免费观看高清完整版在线 | 麻豆视频在线免费观看| 久久嫩草精品久久久精品| 99在线视频免费观看| 亚洲无码久久久久| 老司机免费视频久久| 97婷婷大伊香蕉精品视频| 国产精品 欧美激情| 成人激情诱惑| 尤物tv国产一区| 亚洲区免费视频| 亚洲国产合集| 国产视频在线一区二区| 国模私拍在线观看| 狠狠久久伊人| 亚洲国产精品久久精品怡红院| 人妻激情偷乱视频一区二区三区| 国产电影一区| 欧美一级专区免费大片| 日韩欧美理论片| 精品久久亚洲| 精品久久一区二区| 午夜不卡久久精品无码免费| 国产精品流白浆在线观看| 亚洲精品97久久| 国产传媒第一页| 免费看成人哺乳视频网站| 日韩精品高清视频| 成人性生交大免费看| 精品久久综合| x99av成人免费| 国产成人免费在线观看视频| 91精品国产91久久久久久黑人| 久久夜精品va视频免费观看| 男女羞羞免费视频| 亚洲青涩在线| 欧洲永久精品大片ww免费漫画| 一区二区三区福利视频| 日本在线不卡视频| 亚洲影视九九影院在线观看| 不卡的日韩av| 久久久影视传媒| 亚洲va久久久噜噜噜久久狠狠| 95在线视频| 亚洲免费观看高清完整版在线观看| 欧美黑人在线观看| 在线男人天堂| 555www色欧美视频| 国产伦精品一区二区三区精品| 青青一区二区| 色999日韩欧美国产| 婷婷久久综合网| 国产欧美日韩一级| 国产精品中文在线| 亚洲av无码乱码国产精品| 99麻豆久久久国产精品免费优播| 日韩欧美亚洲v片| 制服丝袜中文字幕在线| 欧美日韩国产精品专区| 日日躁夜夜躁aaaabbbb| 7m精品国产导航在线| 亚洲人成免费电影| 一区二区在线观看免费视频| 久久综合影音| 大波视频国产精品久久| 高清毛片在线看| 一区二区三区高清| 亚洲激情在线观看视频| 91成人入口| 一区国产精品视频| 精品少妇久久久久久888优播| 视频一区二区国产| 国产成人免费观看| 日本三级视频在线观看| 福利精品视频在线| 成人在线短视频| 成人在线免费观看网站| 性色av一区二区三区在线观看| 在线免费看91| 久久天堂av综合合色蜜桃网| 免费看黄色a级片| 影音成人av| 日韩精品免费看| 久久久久黄色片| 久久99在线观看| 日韩精品久久久| 人成在线免费网站| 精品国产凹凸成av人导航| 国产又粗又猛又爽又黄的视频四季| 亚洲精品影视| 国产精品一区二区你懂得| 精品麻豆一区二区三区| 欧洲av在线精品| 中文字幕av网址| 亚洲激情午夜| 超碰97国产在线| 国产精品久久麻豆| 欧美精品一二三四| 成人欧美一区二区三区黑人一| 亚洲欧美网站| 精品国产免费人成电影在线观...| 黄页视频在线播放| 在线综合+亚洲+欧美中文字幕| 九九九视频在线观看| 久久只有精品| 日本一区精品| 激情开心成人网| 亚洲色图色老头| 中文字幕欧美人与畜| 国产精品99无码一区二区| 精品一区二区三区久久| 亚洲精品一区二区三区樱花| 51色欧美片视频在线观看| 欧美日韩在线综合| 日本丰满少妇一区二区三区| 福利视频第一区| 亚洲欧美日韩一区| 国产视频精品免费播放| 久久性感美女视频| 亚洲精华一区二区三区| 欧美日韩mv| 久久五月天综合| 在线免费av片| 国产精品欧美久久久久一区二区| 久久综合久久色| 欧美日韩激情| 国产精品日韩av| 天堂资源在线中文| 欧美一区二区在线播放| 久操免费在线视频| 丁香一区二区三区| 久久久999视频| 欧美久久精品一级c片| 国产精自产拍久久久久久蜜| 久久综合之合合综合久久| 日韩欧美国产小视频| 国产午夜小视频| 久久精品一二三| 做a视频在线观看| 激情欧美国产欧美| 麻豆视频成人| 9999精品免费视频| 久久全球大尺度高清视频| 日韩porn| 欧美精品丝袜中出| 国产亚洲成人av| xfplay精品久久| 欧美一级视频在线| 亚洲福利专区| 亚洲午夜精品久久久中文影院av| 精品麻豆剧传媒av国产九九九| 97国产精品免费视频| 大胆av不用播放器在线播放| 欧美一级生活片| 免费看日批视频| 亚洲欧洲av另类| 97香蕉碰碰人妻国产欧美| 日本午夜一区二区| 欧美视频在线观看视频| 成人动漫免费在线观看| 国产精品视频免费一区| 亚洲精品555| 久久久亚洲福利精品午夜| 丁香婷婷在线| 亚洲成av人乱码色午夜| 一区二区视频网站| 精品久久久久久久久久久久久| 国产又黄又粗又猛又爽的| caoporen国产精品视频| 狠狠操狠狠干视频| 噜噜爱69成人精品| 青青青青在线视频| 久久中文字幕二区| 欧美主播一区二区三区美女 久久精品人| 96sao精品免费视频观看| 国产97在线视频| 国产99在线观看| 色综合久久88色综合天天看泰| 国产免费永久在线观看| 亚洲电影免费观看高清完整版在线| 中文字幕有码视频| 色综合天天综合网国产成人综合天| 欧美日韩精品亚洲精品| 国产精品久久久久久久浪潮网站| 少妇精品一区二区| 国v精品久久久网| 午夜大片在线观看| 美女国产一区二区| 日av中文字幕| 国产偷自视频区视频一区二区| 肉大捧一出免费观看网站在线播放| 波多野结衣在线观看一区二区| 国内精品视频免费| 91大神精品| 99在线高清视频在线播放| 精品午夜视频| 亚洲伊人第一页| 国产精品一区二区三区四区在线观看| 国产精品美乳在线观看| 日本欧美韩国| 国产精品第2页| 主播大秀视频在线观看一区二区| 欧美亚洲另类激情另类| 888av在线视频| 久久久久久久999精品视频| 日本孕妇大胆孕交无码| 欧美另类在线播放| 人人超在线公开视频| 欧美激情性做爰免费视频| 91精品国产91久久久久久青草| 久久久精品国产亚洲| 18在线观看的| 久精品免费视频| 色噜噜狠狠狠综合欧洲色8| 欧美精品一区二区免费| 秋霞在线视频| 午夜精品一区二区三区在线| 国产精品蜜芽在线观看| 国模吧一区二区三区| 第一福利在线视频| 日本午夜人人精品| 成人av色网站| 91亚洲人电影| 69精品国产久热在线观看| 国产精品香蕉视屏| 日韩激情网站| 日韩国产精品一区二区| 久久神马影院| 91精品一区二区三区四区| 国内精品久久久久久久97牛牛| 亚洲国产成人精品无码区99| 亚洲一区二区三区高清| 国产自偷自偷免费一区| 美美哒免费高清在线观看视频一区二区 | 97视频在线观看成人| 在线男人天堂| 国产欧美日韩亚洲精品| 精品国产不卡一区二区| 狠狠色综合欧美激情| 国产中文精品久高清在线不| 在线电影看在线一区二区三区| 欧美日本一区| 日韩一级免费在线观看| 国内成人精品2018免费看| 免费观看污网站| 国产清纯美女被跳蛋高潮一区二区久久w| 综合 欧美 亚洲日本| 樱桃视频在线观看一区| 免费的毛片视频| 91麻豆精品国产自产在线| 高潮毛片7777777毛片| 国产午夜精品美女视频明星a级| 欧美尤物美女在线| 91国语精品自产拍在线观看性色| 日本精品在线一区| 国产成人av一区二区三区| 免费精品国产的网站免费观看| 欧洲精品视频在线| 久久综合影音| 亚洲天堂av网站| ...中文天堂在线一区| 亚洲 欧美 成人| 日韩欧美卡一卡二| av在线免费观看网| 97成人精品视频在线观看| 永久免费观看精品视频| 麻豆传媒一区| 伊人久久久大香线蕉综合直播| 五月婷婷激情久久| 91在线国产福利| 国产十六处破外女视频| 在线观看国产91| 香港一级纯黄大片| 欧美激情18p| 成人在线视频国产| 日韩欧美一区二区视频在线播放 | 欧美一级特黄aaaaaa大片在线观看 | 成人黄色网免费| 九九热精品视频在线观看| 日韩精品视频在线观看视频| 久久99国产精品麻豆| 亚洲综合网在线观看| 亚洲在线免费播放| hs视频在线观看| 中文字幕久久久| 巨茎人妖videos另类| 精品一区国产| 99精品国产在热久久| 午夜性福利视频| 亚洲狠狠丁香婷婷综合久久久| 888奇米影视| 最近2019年好看中文字幕视频 | 男操女在线观看| 欧美精品电影免费在线观看| 国产精品一区二区美女视频免费看| 天天综合狠狠精品| 午夜日韩电影| 日韩不卡的av| 亚洲欧美国产三级| 国产免费视频一区二区三区| 中文字幕亚洲一区二区三区| 日韩av大片站长工具| 免费成人在线观看av| 亚洲一区欧美激情| 亚洲欧美日本一区| 亚洲成人av电影在线| 亚洲经典一区二区三区| 九九热这里只有在线精品视| 视频亚洲一区二区| 国产乱子伦精品无码专区| 国产成人综合视频| 久久久久无码国产精品不卡| 欧美成人激情免费网| 国产后进白嫩翘臀在线观看视频| 成人综合色站| 国产婷婷精品| 免费福利视频网站| 欧美日韩高清一区二区| 国产激情视频在线观看| 91嫩草在线| 精品二区久久| 国产精品探花一区二区在线观看| 狠狠躁夜夜躁人人躁婷婷91| 欧美色图另类| 国产一区二区在线免费| 911久久香蕉国产线看观看| 一级网站在线观看| 夜夜精品视频一区二区| 天堂在线资源8| 国产aⅴ夜夜欢一区二区三区| 不卡在线一区| 中文字幕久久久久久久| 亚洲一区二区三区在线播放| 香蕉视频网站在线| 国产成人精品久久二区二区91| 日韩精品午夜| 麻豆短视频在线观看| 日韩欧美国产免费播放| 秋霞a级毛片在线看| 不卡一区二区三区视频| 国产精品综合| 在线观看黄网址| 亚洲电影第1页| 精品九九久久| 日韩精品一区二区免费| 久久久99精品免费观看不卡| 国产一区二区波多野结衣| 久久久久久一区二区三区 | 中文字幕在线乱| 99riav久久精品riav| 中国a一片一级一片| 欧美高清性猛交| 国内黄色精品| 91精品人妻一区二区三区四区| 一本高清dvd不卡在线观看| 成人在线观看免费网站| 欧美成人蜜桃| 国产一区二区不卡老阿姨| 免费看毛片网站| 欧美日本亚洲视频| 精品一区二区三区的国产在线观看| 黑人无套内谢中国美女| 欧美性黄网官网| 色老头在线观看| 一区二区三区不卡在线|