歡迎您光臨本站 註冊首頁

Linux下C進程管理(fork,wait,exec)

←手機掃碼閱讀     火星人 @ 2014-03-08 , reply:0

在我們編程中用的最多是函數,也就是如何函數調用.那我們如何調用函數呢?

一:我們必須要知道函數的功能是什麼?
二:再看這個函數需要哪些參數?
三:最後看返回值是什麼?
當我們面對一個函數時,既不知道函數的功能也不參數以及返回值時,我們該如何下手呢?
必須得動手查詢唄,可以使用函數手冊,終端,以及書本資料等、
現在就用fork,wait,exec來舉例說明:
fork
功能:創建一個新的進程

一個現存進程調用fork函數是linux內核創建一個新進程的唯一方法(交換進程、init進程和頁精靈進程並不是這樣,這些進程是由內核作為自舉過程的一部分以特殊方式創建的).

參數pid_t fork(void);


返回值:一個是子進程返回0,第二個是父進程的返回值大於0.錯誤返回-1.
頭文件:include<unistd.h>
wait
功能:等待進程
參數
pid_t wait(int*status);返回值:調用成功,返回子進程的PID,發生錯誤返回-1.錯誤原因放在全局變數errno中
頭文件

#include<sys/types.h>

#include<sys/wait.h>
waitpid
函數說明:

在一個子進程結束之前,wait使其調用者阻塞,waitpid使用WNOHANG參數以非阻塞方式等待子進程,waitpid可以指定所需要等待的子進程.

pid == - 1 等待任一子進程.於是在這一功能方面waitpid與wait等效 pid > 0 等待其進程 I D 與 p i d 相等的子進程.

pid == 0 等待其組 I D 等於調用進程的組 I D 的任一子進程.

pid < - 1 等待其組 I D 等於 p i d 的絕對值的任一子進程.
函數原型:

pid_twaitpid(pid_t pid, int *status, int options);

返回值:

執行成功,返回PID為狀態改變的子進程.如果指定了WNOHANG,pid參數所代表的子進程沒有發生狀態變化,0會被返回.執行失敗返回-1.錯誤原因存放在errno中.
頭文件:

#include<sys/types.h>

#include <sys/wait.h>

exec

功能:在用f o r k函數創建子進程后,子進程往往要調用一個e x e c函數以執行另一個程序

當進程調用一種e x e c函數時,該進程完全由新程序代換,而新程序則從其m a i n函數開始執行.調用e x e c並不創建新進程,所以前後的進程I D並未改變.e x e c只是用另一個新程序替換了當前進程的正文、數據、堆和棧段.


函數原型

int execl( constchar *path, const char *arg, ...);

int execlp(const char *file, const char *arg, ...);

int execle( const char *path, const char *arg ,..., char * const envp[]);

int execve(constchar * pathname char *const a rgv [], char *const envp []);

int execv( constchar *path, char *const argv[]);

int execvp(const char *file, char *const argv[]);

巧記

E:指可以傳遞環境變數表

L:單獨的參數傳遞,最後要有一個NULL

V:傳一個指針數組名

P:按照環境變數來查找



範例:

char*ps_argv[]={“ps”,”ax”, NULL};

char*ps_envp[]={“PATH=/bin:/usr/bin”,”TERM=console”, NULL}

execl(“/bin/ps”,“ps”, “ax”, NULL);

execv(“/bin/ps”,ps_argv);

execle(“/bin/ps”,“ps”, “ax”, NULL, ps_envp);

execve(“/bin/ps”,ps_argv, ps_envp);

execlp(“ps”,“ps”, “ax”, NULL);

execvp(“ps”,ps_argv);

execl(“/bin/ps”,“ps”, “ax”, NULL);

execlp(“ps”,“ps”, “ax”, NULL);

execv(“/bin/ps”,ps_argv);

execvp(“ps”,ps_argv);


返回值:成功了沒返回值,失敗了返回-1.
頭文件
#include<unistd.h>


代碼如下:
#include<stdio.h>


#include<unistd.h>
#include<time.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<stdlib.h>
#include<string.h>
#define BUFSIZE 256


int main(void)
{
pid_t pid;
int i=0,j=0,m=0;
char buf[BUFSIZE],cmd[BUFSIZE];

char *argv[10]={NULL};

char *gete=getenv("HOSTNAME");
printf("%s",gete);
while(1)
{

while(gete[m]!='.')

{
buf[m ]=gete[m];
}
printf("%s@%s%s",getenv("USER"),buf,getenv("PWD"));


fgets(cmd,BUFSIZE,stdin);//stdin表示終端
*strchr(cmd, '\n') = ' ';//strchr查找字元串中第一個出現的指定字元
pid=fork();

if(pid==-1)

{
perror("error!\n");
//perror列印出錯誤原因信息字元串
exit(-1);

}

else if(pid==0)
{
while (i < BUFSIZE && cmd[i] != '\0')
{ if (cmd[i] != ' ')

{ argv[j ] = &cmd[i];
i = strchr(&cmd[i], ' ') - cmd; cmd[i] = '\0';

} i ; }
//通過while循環來截取需要的字元,字元串是以'\0' 結束的.
execvp(argv[0], argv);


perror("exec:");
exit(0);
}
else
{

waitpid(pid,NULL,0);
}
}
return 0;
}

本文出自 「世界千變萬化」 博客,請務必保留此出處http://564377073.blog.51cto.com/3938324/833521


[火星人 ] Linux下C進程管理(fork,wait,exec)已經有2363次圍觀

http://coctec.com/docs/linux/show-post-46133.html