创建进程
函数名:fork
函数原型:pid_t fork(void);
函数功能:创建一个子进程
头文件;<unistd.h>
返回值:成功:在父进程中返回子进程的pid,在子进程中返回0 失败:-1
#include <unistd.h> void main() { fork(); printf("program is end\n"); exit(0); } 运行结果:program is end program is end 结果分析:fork函数一旦被调用,在内存中会产生一个新的进程,新进程与父进程代码是一样的,它是从fork之后的语句开始执行
#include <unistd.h> void main() { pid_t pid; pid = fork(); printf("pid is %d\n",pid); exit(0); } 运行结果:pid is 3003 pid is 0
#include <unistd.h> void main() { pid_t pid; pid = fork(); if(pid > 0) { printf("This is father process\n"); exit(0); } else { printf("This is child process\n"); exit(0); } } 运行结果:This is father process This is child process
创建进程
函数名:vfork
函数原型:pid_t vfork(void);
函数功能:创建一个子进程,并阻塞父进程
头文件:<sys/types.h> <unistd.h>
返回值:成功:在父进程中返回子进程的pid,在子进程中返回0 失败:-1
#include <sys/types.h> #include <unistd.h> void main() { pid_t pid; pid = vfork(); if(pid > 0) { printf("This is father process\n"); exit(0); } else { printf("This is child process\n"); exit(0); } } 运行结果:This is child process This is father process
思考以下程序的运行结果:
#include <stdio.h> #include <unistd.h> void main() { pid_t pid; int count = 0; pid = fork(); count++; printf("count = %d\n",count); exit(0); } 运行结果:count = 1 count = 1
#include <stdio.h> #include <unistd.h> void main() { pid_t pid; int count = 0; pid = vfork(); count++; printf("count = %d\n",count); exit(0); } 运行结果:count = 1 count = 2
fork对比vfork
1. fork:子进程拥有独立的数据段和堆栈
vfork:子进程与父进程共享数据段和堆栈
2. fork:父子进程的执行次序不确定
vfork:子进程先运行,父进程后运行
进程退出
正常退出时,父进程可以使用return 0;和exit(0);子进程只能使用exit(0);
不正常退出时,使用exit(1);
进程等待
函数名:wait
函数原型:pid_t wait(int *status);
函数功能:挂起调用它的进程,直到其子进程结束
头文件:<sys/types.h> <sys/wait.h>
返回值:成功:返回终止的那个子进程的id 失败:-1
参数说明:status记录子进程的退出状态
#include <unistd.h> #include <sys/types.h> #include <sys/wait.h> void main() { pid_t pid; pid = fork(); if(pid > 0) { wait(NULL); printf("This is father process\n"); exit(0); } else { printf("This is child process\n"); exit(0); } } 运行结果:This is child process This is father process
执行程序
函数名:execl 还有system
函数原型:int execl(const char *pathname,const char *arg...);
函数功能:运行可执行文件
头文件:<unistd.h>
返回值:成功不返回,失败才返回
参数说明:pathname:要运行的可执行文件的路径 arg:可执行文件运行需要的参数,第一个为文件名并以NULL结束
#include <unistd.h> #include <sys/types.h> #include <sys/wait.h> void main() { pid_t pid; pid = fork(); if(pid > 0) { wait(NULL); printf("This is father process\n"); exit(0); } else { execl("/bin/ls","ls","/home/",NULL); printf("This is child process\n"); exit(0); } } 运行结果:wind This is father process
注意:
fork创建一个新的进程,产生一个新的pid
exec保留原有的进程,但代码替换成了新的代码,执行新的代码