程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 簡述C說話中system()函數與vfork()函數的應用辦法

簡述C說話中system()函數與vfork()函數的應用辦法

編輯:關於C++

簡述C說話中system()函數與vfork()函數的應用辦法。本站提示廣大學習愛好者:(簡述C說話中system()函數與vfork()函數的應用辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是簡述C說話中system()函數與vfork()函數的應用辦法正文


C說話system()函數:履行shell敕令
頭文件:

 #include <stdlib.h>

界說函數:

int system(const char * string);

函數解釋:system()會挪用fork()發生子過程, 由子過程來挪用/bin/sh-c string 來履行參數string 字符串所代表的敕令, 此敕令履行完後隨即前往原挪用的過程. 在挪用system()時代SIGCHLD 旌旗燈號會被臨時棄捐,SIGINT 和SIGQUIT 旌旗燈號則會被疏忽.

前往值:
1、假如 system()在挪用/bin/sh 時掉敗則前往127, 其他掉敗緣由前往-1.。
2、若參數string 為空指針(NULL), 則前往非零值.
3、假如system()挪用勝利則最初會前往履行shell 敕令後的前往值, 然則此前往值也有能夠為system()挪用/bin/sh 掉敗所前往的127, 是以最好能再檢討errno 來確認履行勝利.

附加解釋:在編寫具有 SUID/SGID 權限的法式時請勿應用system(), system()會繼續情況變量, 經由過程情況變量能夠會形成體系平安的成績.

典范

#include <stdlib.h>
main()
{
 system("ls -al /etc/passwd /etc/shadow");
}

履行:

-rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwd
-r--------- 1 root root 572 Sep 2 15 :34 /etc/shadow

C說話vfork()函數:樹立新的過程

頭文件:

#include <unistd.h>

界說函數:

pid_t vfork(void);

函數解釋:
vfork()會發生一個新的子過程, 其子過程會復制父過程的數據與客棧空間, 並繼續父過程的用戶代碼,組代碼, 情況變量、已翻開的文件代碼、任務目次和資本限制等。

Linux 應用copy-on-write(COW)技巧, 只要當個中一過程試圖修正欲復制的空間時才會做真實的復制舉措, 因為這些繼續的信息是復制而來, 並不是指雷同的內存空間, 是以子過程對這些變量的修正和父過程其實不會同步。

另外,子過程不會繼續父過程的文件鎖定和未處置的旌旗燈號。

留意:Linux 不包管子過程會比父過程先履行或晚履行,是以編寫法式時要留心逝世鎖或競爭前提的產生。

前往值:假如 vfork()勝利則在父過程會前往新樹立的子過程代碼(PID), 而在新樹立的子過程中則前往0. 假如vfork 掉敗則直接前往-1, 掉敗緣由存於errno 中.

毛病代碼:
1、EAGAIN:內存缺乏.
2、ENOMEM:內存缺乏, 沒法設置裝備擺設焦點所需的數據構造空間.

典范

#include <unistd.h>
main()
{
 if(vfork() == 0)
 {
  printf("This is the child process\n");
 }
 else
 {
  printf("This is the parent process\n");
 }
}

履行:

this is the parent process this is the child process

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved