创建进程:
pid_t fork(void);
功能:创建一个子进程
返回值:
成功:在父进程中返回子进程的PID
在子进程中返回的是0
失败:-1
#include <unistd.h>
void main()
{
fork();
printf("program is end\n");
}
运行结果:
为什么运行了两次哪?原因:
注意:子进程从fork()函数的下一行开始运行。
验证返回值:
#include <unistd.h>
void main()
{
pid_t pid;
pid = fork();
printf("pid is %d\n",pid);
}
运行结果:
问题:如何让父进程和子进程做不同的事?
#include <unistd.h>
void main()
{
pid_t pid;
pid = fork();
if(pid > 0)
{
//父进程 操作1
printf("This is father process\n");
exit(0);
}
else
{
//子进程 操作2
printf("This is child process\n");
exit(0);
}
}
运行结果:
创建进程另外一种方法:
pid_t vfork(void);
功能:创建一个子进程,并阻塞父进程
返回值:同fork()函数
#include <unistd.h>
#include <sys/types.h>
void main()
{
pid_t pid;
pid = vfork();
if(pid > 0)
{
//父进程 操作1
printf("This is father process\n");
exit(0);
}
else
{
//子进程 操作2
printf("This is child process\n");
exit(0);
}
}
运行结果:
可以明显看到顺序不同
那么在fork()完了以后是父进程先运行还是子进程先运行啊?
如果是fork(),运行顺序不一定;如果是vfork(),肯定是子进程先运行。
fork()和vfork()的区别:
①.父进程和子进程 运行的顺序
②.用fork()创建的子进程有自己独立的数据段/堆栈;
而vfork()创建的子进程没有自己独立的数据段/堆栈,与父进程共享。
#include <unistd.h>
#include <sys/types.h>
void main()
{
pid_t pid;
int count = 0;
pid = fork();
count++;
printf("count is %d\n",count);
exit(0);
}
运行结果:
为什么会这样哪?
#include <unistd.h>
#include <sys/types.h>
void main()
{
pid_t pid;
int count = 0;
pid = vfork();
count++;
printf("count is %d\n",count);
exit(0);
}
进程退出:
exit(0); //退出状态:1为异常退出,0为正常
进程等待:
pid_t wait(int * status);
功能:挂起调用它的进程,直到其子进程结束
返回值:
成功:返回终止的那个子进程的ID
失败:-1
参数:
status:记录子进程的退出状态
实践:
#include <unistd.h>
#include <sys/types.h>
void main()
{
pid_t pid;
pid = fork();
if(pid > 0)
{
//父进程 操作1
printf("This is father process\n");
exit(0);
}
else
{
//子进程 操作2
printf("This is child process\n");
exit(0);
}
}
运行结果:
首先运行父进程,在运行子进程;
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
void main()
{
pid_t pid;
pid = fork();
if(pid > 0)
{
//父进程 操作1
wait(NULL); //等待
printf("This is father process\n");
exit(0);
}
else
{
//子进程 操作2
printf("This is child process\n");
exit(0);
}
}
运行结果:
调用了wait()后可以看到顺序的改变,挂起父进程,直到子进程结束在执行父进程。
程序执行:
int execl(const char * pathname, const char * )
功能:运行可执行文件
返回值:
成功:不返回
失败:才返回
参数:
pathname:要运行的可执行文件的路径
arg:可执行文件运行需要的参数
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
void main()
{
pid_t pid;
pid = fork();
if(pid > 0)
{
//父进程 操作1
wait(NULL);
printf("This is father process\n");
exit(0);
}
else
{
//子进程 操作2
execl("/bin/ls","ls","/home",NULL);
printf("This is child process\n");
exit(0);
}
}
运行结果:
问题:
为什么printf(“This is child process\n”);没有执行?
解释:调用execl()后代码段会进行全部覆盖。
exec对比fork
fork创建一个新的进程,产生一个新的PID;
exec保留原有的进程,执行新的代码。