一、进程创建
pid_t fork(void);
pid_t vfork(void);
调用fork()函数创建一个子进程,返回两个值,子进程返回值为0,父进程返回值为子进程的pid号。创建出来的子进程拷贝了父进程,即子进程获得了父进程的数据空间,堆和栈,但是他们不共享内存。
父子进程的运行顺序由内核调度决定。
函数vfork()创建的子进程与父进程共享内存并且子进程先运行。
pid_t getpid(void);
pid_t getppid(void);
上面的函数获取当前进程的pid,下面的函数获取父进程的pid。
二、进程退出
void exit(int status);
调用该函数退出进程,和_exit()函数不同的是,exit函数清理缓存,
与return不同的是,exit会将控制权给系统,return将控制权给另外一个函数。
通常情况下,参数status为0表示正常退出,为其他值时为异常退出。
如果子进程介绍但没有安全退出,则会变成僵死进程,系统不允许出现过多僵死进程(浪费系统资源)。
如果父进程在子进程前销毁,则该子进程会变成孤儿进程,由init进程来收养(init进程pid为1)。
三、进程等待
pid_t wait(int *wstatus);
pid_t waitpid(pid_t pid, int *wstatus, int options);
进程调用wait函数后,如果没有子进程直接返回错误,否则阻塞直至有一个子进程退出,则该进程收集子进程的退出状态
参数wstatus
如果不关心子进程退出状态,则将wstatus设置为NULL。
如收集子进程退出状态则该状态放入了wstatus指向的整形数中。
想获取状态调用一下宏
WIFEXITED(status)如果子进程正常退出返回非0值,否则返回0
WEXITSTATUS(status)如果WIFEXITED返回非0时,该宏可以获取子进程退出的状态码。
waitpid函数比wait函数多了两个参数,分析如下
参数pid:
pid>0时,只等待该pid的子进程,不管其他进程
pid=-1时,该函数和wait函数一样
pid=0时,等待同一个进程组中的任何子进程,如果子进程已经加入了别的进程组,waitpid不会对它做任何理睬。
pid<-1时,等待一个指定进程组中的任何子进程,这个进程组的ID等于pid的绝对值。
参数options:
写入这个宏时WNOHANG,waitpid函数不会阻塞,其他的宏不太常用。
四、进程替换
当用fork()创建完子进程后,我们不希望子进程和父进程是一样的,从而出现了exce相关函数来进行替换,一般子进程内调用exce族函数用新的程序替换子进程,但pid不变。
int execl(const char *path, const char *arg, ...
/* (char *) NULL */)
int execlp(const char *file, const char *arg, ...
/* (char *) NULL */);
int execle(const char *path, const char *arg, ...
/*, (char *) NULL, char * const envp[] */);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execvpe(const char *file, char *const argv[],
char *const envp[]);
这些函数基本类似
path参数为路径,file参数为可执行文件或者shell
l系列的第二个参数为列表形式,以NULL结尾
v系列的为数组形式
以e结尾的需要添加环境变量
五、相关代码
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
int main()
{
int cmd;
int pid;
while(1)
{
printf("please input the cmd\n");
scanf("%d",&cmd);
if(cmd == 1)
{
pid = fork();
if(pid == 0)
{
execl("/home/wqx/myfile/demo1","",NULL);
}
else
{
wait(NULL);
}
}
else
{
printf("do nothing\n");
sleep(1);
}
}
return 0;
}
该函数的功能是输入命令1时,运行demo1.
运行结果
demo1文件为上一个博客的历程的可执行文件。