main函数的参数
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的时候,才把缓冲区的内容全部输出
注意:exit(0) 与_exit(0)的区别 :
_exit(0) 不会去刷新缓冲区,直接结束进程
进程创建fork()⭐
fork()后,会生成一个独立的子进程,父进程fork()后会返回子进程的pid,子进程会返回0
(子进程与父进程的pid !=)
pid_t pid = fork();
创建(复制)的子进程会跳过创建他的fork(),避免进入死循环
父子进程之间的联系
寻找与记录
PCB里面有单独的一部分 去记录 当前节点的父进程ppid是谁,我们很容易通过子进程去寻找父进程;
所以可以通过tid_t getppid(); 通过子id得到父id
但是我们应该怎么去寻找父进程的子进程呢?
所以在子进程返回给父进程过程中 记录下儿子的pid
便于以后去查找自己的儿子
仅此一次机会记录下来
指定哪个进程执行
子进程和父进程是两个进程
先执行谁取决于操作系统的调度算法 -并发执行
如果指明想要父子进程两个进程之间谁去允许 运行
可以利用:父进程会返回子进程pid 子进程返回0这一特性
使用这样的
if(pis==0) ..子进程.. else ..父进程..
fork()练习
例题一
注意事项:第二次循环的时候父子进程都进行了fork复制,所以有3个A3个B
例题二
去掉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
fork与内存
引入写时拷贝技术:
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。