main函数的参数

图片.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的时候,才把缓冲区的内容全部输出
图片.png
注意:exit(0) 与_exit(0)的区别 :
  _exit(0)  不会去刷新缓冲区,直接结束进程

进程创建fork()⭐

图片.png

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

    pid_t pid = fork();

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

图片.png

父子进程之间的联系

寻找与记录
PCB里面有单独的一部分 去记录 当前节点的父进程ppid是谁,我们很容易通过子进程去寻找父进程;
所以可以通过tid_t getppid(); 通过子id得到父id

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

所以在子进程返回给父进程过程中  记录下儿子的pid
便于以后去查找自己的儿子
仅此一次机会记录下来
指定哪个进程执行

子进程和父进程是两个进程
先执行谁取决于操作系统的调度算法 -并发执行

如果指明想要父子进程两个进程之间谁去允许 运行
可以利用:父进程会返回子进程pid 子进程返回0这一特性
使用这样的

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

fork()练习

例题一

注意事项:第二次循环的时候父子进程都进行了fork复制,所以有3个A3个B
图片.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
图片.png

fork与内存

图片.png
图片.png
图片.png
引入写时拷贝技术:
图片.png


Akuaner
7 声望3 粉丝