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