本篇内容在前边复习+补充了上篇的内容,计算机基础概论可点击目录直达
目录
复习上节
main.c
#include<stdio.h>
#include<math.h>
int main()
{
double d=4.0;
double r=sqrt(d);
printf("r=%.2f\n",r);
return 0;
}
用到了sqrt函数(-l库名)
gcc -o main main.c -lm
ldd main查看用到的库,man sqrt查看sqrt
ldd main
man sqrt
test.c
#include<stdio.h>
#include<math.h>
int main()
{
double d=4.0;
double r=d*2.0;
printf("r=%.2f\n",r);
return 0;
}
编译时直接
gcc -o test test.c
主函数
main.c
#include<stdio.h>
#include<stdlib.h>
//主函数的参数:argc 参数个数,参数内容,环境变量
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]);
}
return 0;
}
编译
stu@stu-virtual-machine:~/Linux/day07$ gcc -o main main.c
stu@stu-virtual-machine:~/Linux/day07$ ./main
argc=1
argv[0]=./main
stu@stu-virtual-machine:~/Linux/day07$ ./main "hello" abc 123
argc=4
argv[0]=./main
argv[1]=hello
argv[2]=abc
argv[3]=123
打印环境变量path
法一
stu@stu-virtual-machine:~/Linux/day07$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
法二
stu@stu-virtual-machine:~/Linux/day07$ printf $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
main.c进阶
for循环打印环境变量
#include<stdio.h>
#include<stdlib.h>
//主函数的参数:argc 参数个数,参数内容,环境变量
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;
}
加环境变量
stu@stu-virtual-machine:~/Linux/day07$ MYSTR="hello"
stu@stu-virtual-machine:~/Linux/day07$ ./main
argc=1
argv[0]=./main
envp[0]=SHELL=/bin/bash
......
envp[52]=OLDPWD=/home/stu/Linux
stu@stu-virtual-machine:~/Linux/day07$ export MYSTR
stu@stu-virtual-machine:~/Linux/day07$ ./main
argc=1
argv[0]=./main
envp[0]=SHELL=/bin/bash
.......
envp[30]=MYSTR=hello
......
envp[53]=_=./main
printf()
Linux常用exit(0)表示正常退出程序(man 3 exit)
sleep(man 3 sleep)
程序阻塞3s
终端:sleep 3
main中:sleep(3)
#include<unistd.h>
先打印hello,再阻塞3s
int main()
{
printf("hello\n");
sleep(3);
exit(0);//退出进程
}
先阻塞3s,再打印hello
原因:hello还在缓冲区
int main()
{
printf("hello");
sleep(3);
exit(0);//退出进程
}
解决方法:
1.强制刷新: \n fflush(stdout)
2.放满了
3.程序结束了 exit(0) 注:_exit(0)不打印
计算机基础概论
1.计算机的基本组成
1.1 计算机组成五大部件
(1) 运算器 :也叫算数逻辑单元,完成对数据的各种常规运算,如加减乘除,也包括逻辑运算,移位,比较等。
(2) 控制器 :它是整个计算机系统的控制中心,它指挥计算机各部分协调地工作,保证计算机按照预先规定的目标和步骤有条不紊地进行操作及处理。
(3) 存储器 :存储程序和各种数据。
(4) 输入设备 :把人所熟悉的信息如,图片,声音,文字,转换为计算机能够识别的信息存储起来。
(5) 输出设备 : 把计算机机能识别的信息转换为人能识别的信息,进行呈现。
一台计算机可以抽象成下图:
CPU 中包含控制器和运算器, 内存就是存储器。I/O 设备就是输入设备和输出设备,如:键盘、显示器、鼠标、硬盘、网卡
1.2 系统总线
(1) 数据总线 :用来在各个功能部件中间传输数据,是双向传输总线。
(2) 地址总线 : 用来指出数据总线上的源数据或目的数据在主存单元的地址或 io 设备的地址。
(3) 控制总线 :由于各个连接在数据总线和地址总线的部件都是共享这两类总线的,那么在某一时刻由谁来使用,就是控制总线负责完成的。
1.3 指令
(1) 指令 :是指示计算机执行某种操作的命令。一条指令通常由两部分构成:地址码 和 操作码。
(2) 程序 : 由一条一条的指令构成。
(3) 指令周期 :cpu 每取出并执行一条指令所需的全部时间称为指令周期。
(4) 指令系统 :计算机能够执行的全部指令的集合称为该计算机的指令系统。
(5) RISC :精简指令系统计算机。
(6) CISC :复杂指令系统计算机。
(7) 程序与指令:高级语言 汇编助记符 机器指令
2.进程概论
(1) 进程:一个正在运行的程序。
(2) PCB : 即是进程控制块,是进程存在的唯一标志。用来描述进程的属性信息。
(3) 进程状态: 就绪 、运行、阻塞
(4) 并发与并行
并行:是指两个或者多个事件在同一时刻发生
并发:是指两个或多个事件在同一时间间隔发生
3.内存管理
3.1 简单分页 逻辑页 物理页 页表
页表存放逻辑页与物理页的对应关系
平时打印的地址是逻辑地址
磁盘 -> 内存 ->缓存 ->寄存器
空间大 速度快
3.2 虚拟内存
虚拟内存提供的三个重要的能力:
1) 它将主存看成是一个存储在磁盘上的地址空间的高速缓存,在主存中只保存活动区域,根据需要在磁盘和主存之间来回传送数据,使得能够运行比内存大的多的进程。
2) 它为每个进程提供了一致的地址空间,从而简化了存储器管理
3) 它保护每个进程的地址空间不被其他进程破坏
4.操作系统发展史
操作系统:管理计算机上的软硬件资源,为用户提供一个交互的接口。
(1) 串行处理
(2) 批处理
(3) 多道程序设计
(4) 分时系统
Linux 进程复制与替换
复制进程 fork
fork 方法
#include<unistd.h>
pid_t fork(void);
函数返回类型 pid_t 实质是 int 类型,Linux 内核 2.4.0 版本的定义是:
fork 函数会新生成一个进程,调用 fork 函数的进程为父进程,新生成的进程为子进程。
pid_t pid的值 在父进程中返回子进程的 pid,在子进程中返回 0,失败返回-1。
fork.c
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<assert.h>
int main()
{
int n=0;
char *s=NULL;
pid_t id=fork();
if(id==0)
{
n=3;
s="child";
}
else
{
n=7;
s="parent";
}
for(int i=0;i<n;i++)
{
printf("s=%s\n",s);
sleep(1);
}
exit(0);
}
结果
s=parent
s=child
s=child
s=parent
s=child
s=parent
s=parent
s=parent
s=parent
s=parent
fork.c
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<assert.h>
int main()
{
int n=0;
char *s=NULL;
pid_t id=fork();
if(id==0)
{
n=3;
s="child";
}
else
{
n=7;
s="parent";
}
for(int i=0;i<n;i++)
{
printf("s=%s,pid=%d,ppid=%d\n",s,getpid(),getppid());
sleep(1);
}
exit(0);
}
结果
stu@stu-virtual-machine:~/Linux/day07$ ./fork
s=parent,pid=3465,ppid=3023
s=child,pid=3466,ppid=3465
s=child,pid=3466,ppid=3465
s=parent,pid=3465,ppid=3023
s=parent,pid=3465,ppid=3023
s=child,pid=3466,ppid=3465
s=parent,pid=3465,ppid=3023
s=parent,pid=3465,ppid=3023
s=parent,pid=3465,ppid=3023
s=parent,pid=3465,ppid=3023
stu@stu-virtual-machine:~/Linux/day07$ ps -f
UID PID PPID C STIME TTY TIME CMD
stu 3023 2218 0 20:35 pts/1 00:00:00 bash
stu 3467 3023 0 22:31 pts/1 00:00:00 ps -f
fork.c
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<assert.h>
int main()
{
int n=0;
char *s=NULL;
pid_t id=fork();
if(id==0)
{
n=3;
s="child";
}
else
{
n=7;
s="parent";
}
for(int i=0;i<n;i++)
{
printf("s=%s,n=%d,&n=%x\n",s,n,&n);
sleep(1);
}
exit(0);
}
结果
stu@stu-virtual-machine:~/Linux/day07$ ./fork
s=parent,n=7,&n=1fb1ad94
s=child,n=3,&n=1fb1ad94
s=parent,n=7,&n=1fb1ad94
s=child,n=3,&n=1fb1ad94
s=parent,n=7,&n=1fb1ad94
s=child,n=3,&n=1fb1ad94
s=parent,n=7,&n=1fb1ad94
s=parent,n=7,&n=1fb1ad94
s=parent,n=7,&n=1fb1ad94
s=parent,n=7,&n=1fb1ad94