主函数参数介绍,printf函数,复制进程fork函数,习题打印A,写实拷贝技术


看书linux内核设计第三版第三章进程管理

一,主函数参数的介绍

#include<stdio.h>
#include<stdlib.h>
int main(int argc,char*argv[],char*envp[])//参数个数,参数内容 ,环境变量
{
    printf("argc=%d\n",argc);
    for(int i=0;i<argc;i++)
    {
     printf("argv[%d]=%s\n",i,argv[i]);
    }
    for(int i=0;envp[i]!=NULL;i++)
    {
      printf("envp[%d]=%s\n",i,envp[i]);
    }
  return 0;
}

二,printf函数

printf 函数并不是直接就输出数据,而是将其放入到缓存区中,遇到以下三种情况才会输出到屏幕;
1,缓存区满了;
2,程序结束时;
3,强制刷新缓冲区; /n fflush(stdout)fflush返回值为int类型,成功则返回0;

   #include<stdio.h>
   #include<stdlib.h>
   #include<string.h>
   #include<unistd.h>
   int main()
   {
   printf("hello");//printf("hello\n");
   //fflush(stdout);
   sleep (3);
  exit(0);
  }

三,复制进程fork函数

函数返回类型 pid_t 实质是 int 类型,Linux 内核 2.4.0 版本的定义是:
在这里插入图片描述

fork 函数会新生成一个进程,调用 fork 函数的进程为父进程,新生成的进程为子进程;在父进程中返回子进程的 pid,在子进程中返回 0,失败返回-1;

每个进程相应的都有一个pcB(进程控制块)pcb中包含着进程的所有信息;
pcb又称为进程描述符 是一个结构体 struct task_struct;

父进程里面的fork()返回值是子进程的id号,子进程里的fork()的返回值是0;
在这里插入图片描述

#include<stdio.h>
#include<stdlib.h>exit(0)头文件
#include<assert.h>
#include<unistd.h>//fork()函数的头文件//sleep函数的头文件
int main()
{
char *s=NULL;
int n=0;
pid_t pid=fork();
assert(pid!=-1);
if(pid==0)
{
n=3;
s="child";
}
else
{
n=5;
s="parent";
}
for(int i=0;i<n;i++)
{
printf("%S\n",s);
sleep(1);
}
exit(0);
}

3.1 习题打印A

1,3个

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int main()
  {
   fork()||fork();
   printf("A\n");
   exit(0);
 }

2,3个

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int main()
  {
   fork()&&fork();
   printf("A\n");
   exit(0);
 }

3,产生6个A

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
 int main()
 {
    for(int i=0;i<2;i++)
   {
    fork();
    printf("A\n");
   }
   exit(0);
 }
                  

在这里插入图片描述
4,产生8个A

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
 int main()
 {
    for(int i=0;i<2;i++)
   {
    fork();
    printf("A");
   }
   exit(0);
 }            

在这里插入图片描述

五,虚拟地址,物理地址,写实拷贝机技术

#include<stdio.h>
 #include<stdlib.h>
 #include<unistd.h>
 #include<assert.h>
 int main()
  {
   char *s=NULL;
   pid_t pid=fork();
   int n=0;
   assert(pid!=-1);
   if(pid==0)
   {
   n=3;
   s="child";
   }
   else
   {
   n=5;
   s="parent";
   }
   for(int i=0;i<n;i++)
   {
     printf("s=%s  id=%d n=%d   %p\n",s,getpid(),n,&n);
    sleep(1);
   }
 exit(0);
}

在这里插入图片描述

3.2 写实拷贝技术

在这里插入图片描述

写实拷贝技术:子进程复制了父进程,一开始父进程与子进程指向同一块物理内存,因此看起来父子进程完全相同,但进程之间具有独立性,意味着当物理内存中的数据即将发生变化时,会重新给子进程分配物理内存,将数据拷贝过来,因为子进程应该有自己的数据;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值