一、前言
1、啟動程序方法:
使用者操作方法:路經 + 程式名稱
程式進行啟動程序:
通過一個程序建立另一個程序的方法
二、方法
頭檔案:
#include <unistd.h>
1、fork() 方法:具有建立程序的功能
- 原型:
pid_t fork( void );
- 調用fork的程序稱為父程序
- 新生成的程序稱為子程序
- 從父程序到子程序的過程我們可以了解為是将原代碼複制了一份。
- fork() 方法調用後,父子程序都從fork調用之後的指令開始執行,這樣就不會造成一直調用fork() 無限循環的情況。
- 在父程序中傳回子程序的pid,在子程序中傳回的是0,如果父程序建立子程序失敗,傳回 -1。
- 舉例:
最終結果為:
world
hello
2、getpid() 方法:擷取目前程序的pid值
3、getppid() 方法:傳回目前程序的父程序的pid
4、注意:fork() 之後,父、子程序是并發執行的過程。
并不是一個程序執行完,再去執行另一個程序。是以如果有想讓子程序執行的操作就放在 if 中,如果有想讓父程序執行的操作就放在 else 中。
舉例:
int main()
{
pid_t pid = fork();
assert(pid != -1);
if(pid == 0)
{
printf("hello:%d\n",getpid());
int i = 0;
for(i;i<5;++i)
{
printf("child\n");
}
}
else
{
printf("world:%d\n",getpid());
int i = 0;
for(i;i<5;++i)
{
printf("father\n");
}
}
}
執行結果:
5、無論是全局變量、局部變量還是堆區變量,如果在子程序中将資料進行修改,對子程序的資料不産生影響。
三、舉例
for(i = 0;i<2;++i)
{
pid_t pid = fork();
assert(pid != -1);
if(pid == 0)
{
printf("A\n");
}
else
{
printf("B\n");
}
}
執行結果:3個A三個B
原因是:
- i = 0時,進行fork生成一個子程序,父程序列印的是B,子程序列印的是A,父子程序同時進行。
- i = 1時,父程序進行fork生成一個子程序,父程序列印的是B,子程序列印的是A,而i = 0時産生的子程序還會因為調用fork産生一個子程序,此時父程序列印的是B,子程序列印的是A