Linux进程的创建图文教程,Linux - 进程的创建fork()

main函数的参数

112b22d3ab0a16b0ba6ec56ea32ea1f9.png

argc 传进的参数个数

argv :参数

注意:利用for循环打印char* argv[]

for循环内部不能直接定义int i=0; 内置不对

[root@localhost 2020-03-19]# ls

main main.c

[root@localhost 2020-03-19]# ./main

argc:1

argc[0]=./main

[root@localhost 2020-03-19]# ./main hello world

argc:3

argc[0]=./main

argc[1]=hello

argc[2]=world

[root@localhost 2020-03-19]# ./main "hello world"

argc:2

argc[0]=./main

argc[1]=hello world

输出缓冲区

缓冲区 加载 停止条件  /\n

当遇到n的时候,才把缓冲区的内容全部输出

dba808a452534a6582d6cfc37b005495.png

注意:exit(0) 与_exit(0)的区别 :

_exit(0)  不会去刷新缓冲区,直接结束进程

进程创建fork():star:

b9754d716a9c4ae8b197b2d3e1434a59.png

fork()后,会生成一个 独立的子进程 ,父进程fork()后会返回子进程的pid,子进程会返回0

(子进程与父进程的pid !=)

pid_t pid = fork();

创建(复制)的子进程会跳过创建他的fork(),避免进入死循环

d8451af19a892e552bba87f397ea2528.png

父子进程之间的联系

寻找与记录

PCB里面有单独的一部分 去记录 当前节点的父进程ppid是谁,我们很容易通过子进程去 寻找 父进程;

所以可以通过tid_t getppid(); 通过子id得到父id

但是我们应该怎么去寻找父进程的子进程呢?

所以在子进程返回给父进程过程中 记录 下儿子的pid

便于以后去查找自己的儿子

仅此一次机会记录下来

指定哪个进程执行

子进程和父进程是两个进程

先执行谁取决于操作系统的调度算法 -并发执行

如果指明想要父子进程两个进程之间谁去允许 运行

可以利用: 父进程会返回子进程pid 子进程返回0 这一特性

使用这样的

if(pis==0) ..子进程.. else ..父进程..

fork()练习

例题一

注意事项:第二次循环的时候 父子进程都进行了fork复制 ,所以有3个A3个B

b399d2147292f05319e6d3d5579e8a11.png

例题二

去掉n以后

缓冲区本来有的值也赋值了

AB | i=1

AB  AB |i=2

+AB |i=1

所以会出现4个A 4个B

for(i=0;i<2;++i)

{

pit_t pid = fork();

assert(-1 != pid);

if(pid == 0)

{

printf("A ");

}

else

{

printf("B ");

}

}

例题三

所以是3个A

0c21f24e8cbd9e5653db16d6b239fe91.png

fork与内存

79312b183d2b0a6d9fbd113a1a522bc5.png

c5ec618083744a05a74d8c5f9f1cbaf9.png

771a835f77f915ed55c48e44f7a1206e.png

引入写时拷贝技术:

6d4f11411ccb2f975a98f0e63016fa66.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值