Head First C 第九章 進程與系統調用 用fork()+exec()運行子進程

Head First C 第九章 進程與系統調用 用fork()+exec()運行子進程

問題引入:當你想循環使用exec調用另一個程序時,發現只調用了一次就結束了。這是由於,exec函數經過運行新程序來替換當前程序,所以,後面的代碼都沒有運行。 爲了達到咱們想要的效果,在此引入fork()系統調用。python

實例:RSS訂閱功能
int main(int argc, char *argv[]) {
  char *feeds[] = {"http://www.cnn.com/rss/celebs.xml",
                   "http://www.rollingstone.com/rock.xml",
                   "http://eonline.com/gossip.xml"};
  int times = 3;
  int i;
  char *phrase = argv[1];
  for (i = 0; i < times; i++) {
    char var[255] = {};
    sprintf(var, "RSS_FEED=%s", feeds[i]);
    char *vars[] = {var, NULL};
    if (execle("/usr/bin/python", "/usr/bin/python", "rssgossip.py", phrase, NULL, vars) == -1) {
      fprintf(stderr, "%s\n", strerror(errno));
      return 1;
    }
  }
  return 0;
}

在這段代碼中,有一個for (i = 0; i < times; i++)循環,其中包含一個execle("/usr/bin/python", "/usr/bin/python", "rssgossip.py", NULL, vars)語句,用於調用一個叫做rssgossip.py的腳本。git

咱們的本意是想循環調用,可是實際上,這個語句只會運行一次。咱們嘗試用fork來讓它屢次運行。github

*fork()*的使用
  1. 使用步驟:
    1. 複製進程:第一步用fork()系統調用來複製當前進程。進程須要以某種方式區分本身是父進程仍是子進程,爲此fork()函數向子進程返回0,向父進程返回非零值。
    2. 若是是子進程,就調用exec()。 如今你有兩個獨立的進程,子進程在運行rssgossip.py腳本,而原來的父進程能夠繼續作其餘事,徹底不受干擾。
  2. 修改原有的程序代碼

主要改動內容爲: 1. 建立一個子進程pid_t pid; 2. 使用fork()函數複製當前進程。 3. 監控返回值,若是爲0則表示爲子進程,則使用execle()調用腳本取代該進程。 4. 父進程在execle()後面的代碼能夠繼續執行,即,能夠循環建立子進程來得到rss訂閱內容。函數

for (i = 0; i < times; i++) {
    char var[255];
    sprintf(var, "RSS_FEED=%s", feeds[i]);
    char *vars[] = {var, NULL};
    pid_t pid;
    if ((pid = fork()) < 0) {
      fprintf(stderr, "Can't fork process: %s\n", strerror(errno));
      return 1;
    } else if (pid == 0) {
      if (execle("/usr/bin/python", "/usr/bin/python", "./fake_rss.py", phrase, NULL, vars) == -1) {
        fprintf(stderr, "Can't run script: %s\n", strerror(errno));
        return 1;
      }
    }
  }
示例代碼

fork samplecode

相關文章
相關標籤/搜索