Linux fork函数
1、fork函數(shù)用于創(chuàng)建子進(jìn)程,其特殊性在于調(diào)用一次fork函數(shù),會(huì)得到兩次返回值:
? ? 1)在父進(jìn)程中,fork返回新創(chuàng)建子進(jìn)程的進(jìn)程ID;
????2)在子進(jìn)程中,fork返回0;
????3)如果出現(xiàn)錯(cuò)誤,fork返回一個(gè)負(fù)值;
簡(jiǎn)單示例:
#include "stdio.h" #include "stdlib.h" #include "unistd.h" #include <iostream> using namespace std;int main(int argc, char **argv) {pid_t pid;cout << "begin process..." << endl;pid = fork();if (pid == -1){cout << "fork error." << endl;exit(1);}else if (pid == 0){cout << "Im a child,pid = " << getpid() << ",ppid = " << getppid() << endl;}else{cout << "Im a parent,pid = " << getpid() << ",ppid = " << getppid() << endl;//延時(shí),保證父進(jìn)程后退出sleep(1);}cout << "end process..." << endl; }運(yùn)行結(jié)果:
?2、簡(jiǎn)單示例,創(chuàng)建5個(gè)子進(jìn)程:
#include "stdio.h" #include "stdlib.h" #include "unistd.h" #include <iostream> using namespace std;int main(int argc, char **argv) {int i;pid_t pid;cout << "begin process..." << endl;for (i = 0; i < 5; ++i){pid = fork();if (pid == 0) //子進(jìn)程{break;}}sleep(i);if (i < 5){cout << "我是第 " << i + 1 << " 個(gè)子進(jìn)程,pid = " << getpid() << endl;}else{cout << "我是父進(jìn)程" << endl;}cout << "end process..." << endl;return 0; }?3、父子進(jìn)程共享機(jī)制:讀時(shí)共享,寫時(shí)復(fù)制。
4、fork函數(shù)的作用,來(lái)自別處作為參考:
當(dāng)你要?jiǎng)?chuàng)建一個(gè)子進(jìn)程的時(shí)候就用fork()函數(shù),它一般有兩種應(yīng)用,
第一,創(chuàng)建一個(gè)子進(jìn)程用來(lái)執(zhí)行和父進(jìn)程不同的代碼段,這個(gè)在網(wǎng)絡(luò)中應(yīng)用比較廣,比如服務(wù)器端fork一個(gè)子進(jìn)程用來(lái)等待客戶端的請(qǐng)求,當(dāng)請(qǐng)求到來(lái)時(shí),子進(jìn)程響應(yīng)這個(gè)請(qǐng)求,而父進(jìn)程則繼續(xù)等待客戶端請(qǐng)求的到來(lái);
第二,創(chuàng)建一個(gè)子進(jìn)程用來(lái)執(zhí)行和父進(jìn)程不同的程序,這種應(yīng)用往往 fork一個(gè)子進(jìn)程之后立即調(diào)用exec族函數(shù),exec族函數(shù)則調(diào)用新的程序來(lái)代替新創(chuàng)建的子進(jìn)程。
5、讓子進(jìn)程調(diào)用一個(gè)程序執(zhí)行其它操作:
此處使用exec函數(shù)族中的函數(shù):execlp和execl,函數(shù)只在執(zhí)行錯(cuò)誤的時(shí)候返回。
execlp:在環(huán)境變量所指的目錄中查找參數(shù)file所指的文件(可執(zhí)行程序);
execl:在path字符串所指的目錄中查找可執(zhí)行程序;
int execl(const char *path, const char *arg, .../* (char *) NULL */); int execlp(const char *file, const char *arg, .../* (char *) NULL */);?簡(jiǎn)單示例:
#include "stdlib.h" #include "unistd.h" #include <iostream> using namespace std;int main(int argc, char **argv) {pid_t pid;pid = fork();if (pid == -1){cout << "fork error." << endl;exit(1);}else if (pid == 0){cout << "Im a child,pid = " << getpid() << ",ppid = " << getppid() << endl;//調(diào)用一個(gè)新進(jìn)程來(lái)代替子進(jìn)程execlp("ls", "ls", "-l", NULL);//如果執(zhí)行失敗,才能執(zhí)行到此處:結(jié)束子進(jìn)程exit(0);}else{cout << "Im a parent,pid = " << getpid() << ",ppid = " << getppid() << endl;//延時(shí),保證父進(jìn)程后退出sleep(1);}return 0; }?
總結(jié)
以上是生活随笔為你收集整理的Linux fork函数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: fork()函数详解
- 下一篇: 对计算机态度英语作文,对自动化的看法英语