linux中进程的控制总结,Linux中的进程控制
我們知道,程序就是一個包含可執行代碼的文件,是一個靜態的文件。
進程就是可執行程序的一次執行過程,是一個動態的概念,在Linux系統中所有運行的東西都可以稱之為進程。
進程的基本狀態三種:運行態、就緒態和阻塞態(或等待態)。
下面我們來介紹一下進程控制中的相關函數:
1、fork函數
fork函數的功能是產生子進程,子進程會完全復制父進程的資源,并且子進程的執行完全獨立于父進程,調用一次會有兩個返回值,在子進程里面返回0,在父進程里面返回子進程的pid號,fork函數存在于頭文件#include
一個簡單的例子:
#include
#include
#include
int main(){
int p_id;
p_id=fork( );
if (p_id==0)
printf("child process\n");
else
printf("parent process\n");
}
在這里需要注意的是fork函數創建進程以后父子進程所隨機運行的,并沒有誰先誰后一說。所以如果父進程先結束,子進程就變成了孤兒進程,這對于一個程序來說是不能允許的錯誤,所以如果希望父進程在子進程結束后再結束,可以使用wait函數:
pid_t wait (int * status); (頭文件: wait.h)
wait函數會“暫停”目前進程的執行,直到有信號來到或子進程結束
如果在調用 wait()時子進程已經結束,則 wait()會“立即”返回子進程結束狀態值,如果有錯誤發生則返回返回值-1。失敗原因存于 errno 中。
子進程的結束狀態值(如exit函數中的值)會存放在參數 status 中, 而wait函數的返回值是子進程的進程號
waitpid:pid_t waitpid(pid_t pid, int * status, int options);
等待指定的子進程結束
簡單的例子:
int main()
{ pid_t pc, pr;
pc=fork();
if(pc<0) printf("Error fork.\n");
else if(pc==0){
sleep(10);
exit(0);
}
else{
pr = waitpid(pc, NULL, 0);
if(pr==pc)
printf("Get child %d\n",pr);
else
printf("some error occured.\n");
}
}
這樣父進程就會在子進程執行結束以后再執行。
下面我們來探討一下更高級的問題,如何來創建多個子進程呢,我們知道父子進程都會執行除了進程控制的其他語句,如果我們直接調用fork函數就會創建數不清的進程,比如:
int main(){
int p_id;
p_id=fork( );
if (p_id==0)
printf("child process 1\n");
else
{
wait();
printf("parent process 1\n");
}
p_id=fork( );
if (p_id==0)
printf("child process 2\n");
else
{
wait();
printf("parent process 2\n");
}
}
那么如何避免這種情況呢,最簡單的方法就是使用進程鏈:
#include
#include
#include
int main(){
int i;
pid_t child_pid;
for(i=1;i<3;i++)
{
child_pid = fork();
if( child_pid==0 )
{ printf( "do something \n"); return 0;}
else{ wait(); }
}
return 0;
}
我們用一個return語句來退出if語句執行下一個進程創建函數,這樣就避免了子進程在創建子進程的操作。
總結
以上是生活随笔為你收集整理的linux中进程的控制总结,Linux中的进程控制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux内核路由反向检查,反向路径过滤
- 下一篇: linux红帽子桌面模式ftp,Linu