1. fork ():子进程拷贝父进程的数据段,代码段
vfork ( ):子进程与父进程共享数据段
2. fork ()父子进程的执行次序不确定
vfork 保证子进程先运行,在调用exec 或exit 之前与父进程数据是共享的,在它调用exec
或exit 之后父进程才可能被调度运行。
3. vfork ()保证子进程先运行,在她调用exec 或exit 之后父进程才可能被调度运行。如果在
调用这两个函数之前子进程依赖于父进程的进一步动作,则会导致死锁。
下面是具体的代码:
fork:
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
pid_t pid = fork();//创建子进程
if(pid == -1)
{
perror("fork");
return -1;
}
if(pid == 0)//子进程
{
printf("child process pid : %d My parent process pid :%d\n",getpid(),getppid());
exit(0);
}
else{//pid > 0 父进程
printf("parent pid :%d my parent pid:%d\n",getpid(),getppid());
}
return 0;
}
运行结果:
hqyj@ubuntu:~/DLL/day4$ gcc fork.c
hqyj@ubuntu:~/DLL/day4$ ./a.out
parent pid :21507 my parent pid:20953
hqyj@ubuntu:~/DLL/day4$ child process pid : 21508 My parent process pid : 1401
为什么两条语 都会打印呢?这是因为fork()函数用于从已存在的进程中创建一个新的进
程,新的进程称为子进程,而原进程称为父进程,fork()的返回值有两个,子进程返回0,
父进程返回子进程的进程号,进程号都是非零的正整数,所以父进程返回的值一定大于零,
在pid=fork();语句之前只有父进程在运行,而在pid=fork();之后,父进程和新创建的子进程
都在运行,所以如果pid==0,那么肯定是子进程,若pid !=0(事实上肯定大于0),那么是
父进程在运行
vfork:
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
int main(int argc, char *argv[])
{
pid_t pid = vfork();//创建子进程
if(pid == -1)
{
perror("vfork");
return -1;
}
if(pid == 0)//子进程
{
printf("child process pid : %d My parent process pid : %d\n",getpid(),getppid());
exit(0);
}
else{//pid > 0 父进程
printf("parent pid :%d my parent pid:%d\n",getpid(),getppid());
}
return 0;
}
运行结果:
hqyj@ubuntu:~/DLL/day4$ gcc fork.c
hqyj@ubuntu:~/DLL/day4$ ./a.out
child process pid : 21523 My parent process pid : 21522
parent pid :21522 my parent pid:20953
hqyj@ubuntu:~/DLL/day4$
还是打印两条语句,但是子进程要比父进程先运行,而且子进程并没有拷贝数据,而是和父进程共享数据。