目录
一.主函数的三个参数
1.argc,argv
2.环境变量envp
3.envp,argv都是以NULL作为结尾的
4.什么是shell
二.printf隐藏的缓冲区
1.演示缓冲区没有存在感
2.缓冲区的存在
3.强制刷新
4._exit与exit
5.总结
三.进程的基础知识
1.进程
2.PCB:进程控制块
3.进程的状态
4.并发与运行
四.操作系统发展史
五.fork复制进程
一.主函数的三个参数
argc,argv,envp
argc代表命令行的参数个数
argv[]存储命令参数,其中argv[0]通常代表该程序的程序名
envp[]代表系统的环境变量
1.argc,argv
argc和argv的使用
#includeint main(int argc,char *argv[],char *envp[]) { int i=0; printf("argc=%dn",argc); for(;i
argc=2,表示除了程序名外还有一个参数
argv[0]指向输入的程序路径及名称
argv[1]指向123字符串
2.环境变量envp
envp是由父进程继承过来的参数;
环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数;
for(i=0;envp[i]!=NULL;i++)
{
printf("envp[%d]=%sn",i,envp[i]);
}
3.envp,argv都是以NULL作为结尾的
for(;argv[i]!=NULL;i++)
{
printf("argv[%d]=%sn",i,argv[i]);
}
4.什么是shell
shell俗称“壳”,用来区别于核
shell是一个命令解释器,位于操作系统和应用程序之间,是他们二者的接口,负责把应用程序的输入命令信息解释给操作系统,将操作系统指令处理后的结果解释给应用程序。
bash是大多数Linux系统默认的shell
二.printf隐藏的缓冲区
1.协助存储和内部处理,用户态切换到内核态(切换开销大),减少其次数
2.尽可能提高潜在效率
1.演示缓冲区没有存在感
#include
int main()
{
printf("hello");
}
2.缓冲区的存在
#include
#include
#include
int main()
{
printf("hello");
sleep(3);
exit(0);
}
3.强制刷新
#include#include #include int main() { printf("hello"); sleep(3); exit(0); }
3.强制刷新
(1)遇到n自动刷新
printf("hellon");
(2)使用fflush刷新屏幕
fflush(stdout);
stdout标准输出
4._exit与exit
exit是先刷缓冲区,然后再调用_exit(真正的退出)
_exit直接退出,不会刷新缓冲区
5.总结
printf将内容先写入到缓冲区,缓冲区刷新到界面(屏幕)上的条件是:
(1)缓冲区放满
(2)缓冲区未满,强制刷新缓冲区到屏幕
方法一:n
方法二:主动刷新:fflush(stdout);
(3)程序结束时,自动刷新缓冲区,exit方法
三.进程的基础知识
1.进程
一个正在运行的程序
2.PCB:进程控制块
专门用来管理进程块,维护进程相关信息
进程控制块是用一个结构体struct task_struct实现
3.进程的状态
就绪,阻塞,运行
4.并发与运行
并行:某一个时刻,多个程序同时运行
并发:某一个CPU,对于多个程序,CPU来回切换
四.操作系统发展史
操作系统:管理计算机上的软硬件资源,为用户提供一个交换的接口
(1)串行处理
(2)简单批处理
(3)多道程序设计
(4)分时系统
五.fork复制进程
pid_t fork(void);
函数返回类型pid_t实质是int类型
fork函数会新生成一个进程,调用fork函数的进程为父进程,新生成的进程为子进程。在父进程中返回子进程的PID,在子进程中返回0,失败返回-1
fork是把已有的进程复制一份,当然把PCB也复制了一份,然后申请一个PID,子进程的 PID(父进程的)+1;
子进程的PID=父进程的PID+1;
如果父子进程想要做不同的事情,那么我们通过返回值来判断;
#include#include #include #include #include int main() { char *s=NULL; int n=0;//控制父子进程执行的次数 pid_t id=fork(); assert(id!=-1); if(id==0)//子进程 { s="child"; n=3; } else { s="parent"; n=7; } //父子进程一起运行 int i=0; for(;i getppid:得到一个进程的父进程的PID;
getpid:得到当前进程的PID;
for(;i父子程序交换打印,并不是先打印完其中一个再进行下一个,显然,父子进程在并发进行



