在我們編程中用的最多是函數,也就是如何函數調用.那我們如何調用函數呢?
一:我們必須要知道函數的功能是什麼?
二:再看這個函數需要哪些參數?
三:最後看返回值是什麼?
當我們面對一個函數時,既不知道函數的功能也不參數以及返回值時,我們該如何下手呢?
必須得動手查詢唄,可以使用函數手冊,終端,以及書本資料等、
現在就用fork,wait,exec來舉例說明:
fork
功能:創建一個新的進程
一個現存進程調用fork函數是linux內核創建一個新進程的唯一方法(交換進程、init進程和頁精靈進程並不是這樣,這些進程是由內核作為自舉過程的一部分以特殊方式創建的).
參數:pid_t fork(void);
#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);
返回值:
#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>
本文出自 「世界千變萬化」 博客,請務必保留此出處http://564377073.blog.51cto.com/3938324/833521
[火星人 ] Linux下C進程管理(fork,wait,exec)已經有2363次圍觀