fork
进程是通过逻辑语句来判断 第i个进程做什么事情
程序
二进制文件,占用的磁盘空间
进程,启动的应用程序
所有的数据都在内存中 需要占用更多的系统资源
代码
创建子进程
int fork (void)
父子进程的进程id不一样,
对于fork函数的返回值,可以据此区别父子进程
父进程返回子进程的id,说明子进程创建成功 子进程返回0
子进程创建成功后,代码的执行位置
注:父进程执行到哪,子进程就从哪开始执行 如下程序, 当i=0时,创建第一个子进程,此时第一个子进程从i=0开始执行 当i=1时,创建第二个子进程,此时第二个子进程从i=1开始执行
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <string.h>
int main(int argc, const char * argv[])
{
int num = 2;
int i;
for (i=0; i<num; i++){
int pid = fork();
printf ("i = %d, procss = %d \
pid = %d\n", i, getpid(), pid) ;
if (pid == 0)
break;
}
if (i == 0) //第一个子进程
{
printf ("frist\n");
}
else if (i == 1) //第二个子进程
{
printf ("second\n");
}
else //父进程
{
printf ("P\n");
}
return 0;
}
父子进程执行顺序
不一定,谁先抢到,谁先执行 shell不知道创建了子进程 父进程执行完后,shell切换到前台,所以,只有子进程执行完后父进程才结束。 不能根据打印顺序确定执行顺序 可以用如下代码进行验证
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <string.h>
int main(int argc, const char * argv)
{
pid_t pid;
printf ("上\n");
for (int i=0; i<4; i++)
printf ("%d ", i);
printf ("\n");
pid = fork(); //头文件为unistd.h
if (pid>0)
{
printf ("p pid = %d", getpid());
}
else if (pid == 0)
{
printf ("C : pid = %d , ppid = %d", getpid(), getppid());
}
printf ("下\n");
for (int i=0; i<4; i++)
printf ("%d ", i);
printf ("\n");
return 0;
}
getpid
得到当前进程的进程id
getppid
得到当前进程的父进程id
通过实例加深对进程的理解
|