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