#include <unistd.h> #include <stdio.h> #include <time.h> #include <sys/time.h> #include <stdlib.h> int main(void){ pid_t pid; struct timeval tv1,tv2; struct timezone tz; pid = fork(); if(pid < 0){ perror("vfork failed!"); exit(1); } if(pid==0){ gettimeofday(&tv1,&tz); printf("这是子进程开始了!"); printf("子进程开始的时间:tv1_sec %ld tv1_usec %ld\n",tv1.tv_sec,tv1.tv_usec); }else{ gettimeofday(&tv2,&tz); printf("这是父进程开始了!"); printf("父进程开始的时间:tv2_sec %ld tv2_usec %ld\n",tv2.tv_sec,tv2.tv_usec); } return 0; }用vfork()替代原fork()函数,修改程序,使其正常运行。说明vfork的作用、使用方法与注意事项。
时间: 2024-02-14 10:11:27 浏览: 74
修改后的程序如下:
```c
#include <unistd.h>
#include <stdio.h>
#include <time.h>
#include <sys/time.h>
#include <stdlib.h>
int main(void){
pid_t pid;
struct timeval tv1,tv2;
struct timezone tz;
pid = vfork();
if(pid < 0){
perror("vfork failed!");
exit(1);
}
if(pid==0){
gettimeofday(&tv1,&tz);
printf("这是子进程开始了!");
printf("子进程开始的时间:tv1_sec %ld tv1_usec %ld\n",tv1.tv_sec,tv1.tv_usec);
_exit(0); // 子进程必须要退出,否则会导致父子进程共享资源,出现问题
}else{
gettimeofday(&tv2,&tz);
printf("这是父进程开始了!");
printf("父进程开始的时间:tv2_sec %ld tv2_usec %ld\n",tv2.tv_sec,tv2.tv_usec);
}
return 0;
}
```
vfork()函数与fork()函数类似,都是用于创建进程的系统调用。不同之处在于,vfork()函数创建的子进程与父进程共享内存空间,而fork()函数创建的子进程则会复制父进程的内存空间。因此,在使用vfork()函数时,需要注意以下几点:
1. vfork()函数创建的子进程与父进程共享内存空间,因此子进程必须要立即调用exec()或者_exit()函数退出,否则会导致父进程和子进程同时使用同一块内存空间,出现问题。
2. 父进程在子进程调用exec()或者_exit()函数之前会被阻塞,直到子进程完成了必要的处理之后才会继续执行。
3. vfork()函数创建的子进程不会复制父进程的地址空间,因此子进程修改父进程的变量或者调用函数可能会导致未定义的行为。
4. vfork()函数可以用于创建进程,但是由于其存在一些限制条件,在实际开发中建议优先使用fork()函数。
阅读全文