创建进程
函数名: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保留原有的进程,但代码替换成了新的代码,执行新的代码