创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
🔥c++系列专栏:C/C++零基础到精通 🔥给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ
c语言内容💖:
专栏:c语言之路重点知识整合
操作系统给用户提供了一系列的函数接口,让用户进行与进程有关的编程。
一、fork()函数
fork()函数用于创建一个子进程,调用fork()函数的是父进程
该子进程与父进程几乎完全相同,父子进程的代码共享,但是他们的进程id(PID)不同。
fork()函数拥有两个返回值:
- 父进程的fork()函数返回子进程的pid
- 子进程的fork()函数返回0
父进程进行代码的全部,子进程执行从fork()函数后的代码,父子进程同时执行
fork()函数的使用举例:
#include <stdio.h>
#include <unistd.h>
int main()
{
printf("11111111\n");
pid_t pid;
pid = fork();
if(pid > 0)
{
//Father
printf("Father pid:%d \n",getpid());
}
else if(pid == 0)
{
//Child
printf("Child pid:%d,Father pid:%d\n",getpid(),getppid());
}
else
{
perror("processs fail\n");
}
printf("22222\n");
getchar();
return 0;
}
可以看出 父进程执行了:
printf(“11111111\n”);
printf(“Father pid:%d \n”,getpid());
printf(“22222\n”);
getchar();
子进程执行了:
printf(“Child pid:%d,Father pid:%d\n”,getpid(),getppid());
printf(“22222\n”);
getchar();
子进程并没有执行fork()函数以上的代码。
如何看出父子进程是同时执行的呢?
在子进程代码块中加入getchar()阻塞,
这次子进程并没有继续向下执行printf(“22222\n”);
二、fork()函数的读时共享,写时复制
传统的fork()函数会将父进程的资源拷贝一份继承给子进程,但是子进程可能不会用到这个拷贝的资源,造成浪费
写时复制指的是在子进程(或父进程)试图访问父进程的资源时,才将父进程的资源拷贝一份,然后修改这个资源的副本,不影响其他进程共享读取原来的资源(读时共享)
三、循环fork
以下的代码会创建几个子线程,共有多少个线程?
fork();
fork();
for(int i = 0;i < 3;i++)
{
fork();
}
子进程: 2 i − 1 2^i -1 2i−1个
总进程数量: 2 i 2^i 2i个
大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。 |
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●'◡'●) |