🎂创建子进程
包含头文件
#include <unistd.h>
在代码中创建进程通过pid_t fork(void)
;函数就可以!!
来看代码例子吧👇(可以自己在Linux下运行)
fork_create.cpp
#include <unistd.h>
#include <stdio.h>
int main()
{
pid_t fpid;//fpid表示fork函数返回的值
int count=0;
fpid=fork();//会返回两个fpid(一个对于子进程一个是对于父进程)
if (fpid < 0)
printf("error in fork!");
else if (fpid == 0) {//对于子进程来说,pid会等于0
printf("i am the child process, my process id is %d\n",getpid());
printf("I’m children\n");
count +=2;
}
else {
printf("parent process return fpid:%d\n",fpid);//对于父进程会返回子进程的pid
printf("i am the parent process, my process id is %d\n",getpid());
printf("I’m parent.\n");
count++;
}
printf("统计结果是: %d\n",count);
return 0;
}
运行结果:
编译命令:gcc fork_create -o fork_create.exe
调用fork函数后,会创建一个子进程,并且父子两个进程都从fork处执行,fork函数有两个返回值,对于父进程会返回子进程的pid,此时pid会大于0,对于子进程来说,pid会等于0。
传统的linux操作系统以统一的方式对待所有的进程:子进程复制父进程所拥有的所有资源
,这种方法使得创建进程非常非常非常慢,因为子进程需要拷贝父进程的所有的地址空间,那现代的操作系统,是如何处理的呢?主要有以下三种方式:
- 写时复制(比如上述例子就输出了两个count的值,那是因为父子进程都进行了写操作,所以输出不同的值)
- 轻量级进程允许父子进程共享每进程在内核的很多数据结构,比如地址空间、打开文件表和信号处理。
- vfork系统调用创建的进程能共享其父进程的内存地址空间,为了防止父进程重写子进程需要的数据,阻塞父进程的执行,一直到子进程退出为止。
🚀销毁进程
exit所需要的头文件
#include <stdlib.h>
wait所需要的头文件
#include <sys/types.h>
#include <sys/wait.h>
要销毁子进程用exit(int)
就可以了,我们可以通过wait
方法获取出销毁进程所带的状态值(就是exit中所带的int)
看代码吧👇
fork_create_destroy.cpp
#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>
int main()
{
pid_t fpid;//fpid表示fork函数返回的值
int count = 0;
int status = 0;
fpid=fork();
if (fpid < 0)
printf("error in fork!");
else if (fpid == 0) {
printf("i am the child process, my process id is %d\n",getpid());
printf("I’m children\n");
count +=2;
exit(2);//销毁子进程
}
else {
printf("parent process return fpid:%d\n",fpid);
printf("i am the parent process, my process id is %d\n",getpid());
printf("I’m parent.\n");
count++;
}
printf("统计结果是: %d\n",count);
wait(&status);//返回进程挂掉的一个结构体(返回子进程exit带的结构体)
printf("parent:status:%d\n",WEXITSTATUS(status));//如果要返回当时进程挂掉的值,需要加宏WEXITSTATUS,而且exit中所带的值得为正数
return 0;
}
运行结果: