linux和网络

bash/shell或C库函数或应用程序等 -> 系统调用函数 -> OS(操作系统)-> 驱动程序 -> 硬件。
man 3 库函数,man 2系统调用函数。

.C文件(#开头的都是预处理指令)->预处理->.C->编译->汇编语言->汇编->.O文件的机器语言->链接(绑定程序运行的通用环境,比如其他.o文件)->a.out可执行文件,
比如当前.O文件的main函数里面有main的实现细节,但是没有printf的实现细节,需要连接一个.O文件,它包含了printf的实现细节,需要连接一个.O文件,它包含了start函数的实现细节,且需要用到main函数,但是没有main函数的实现细节。

静态链接:在编译时完成,代码直接进行组合。
动态链接:在程序执行过程中,代码加载到内存执行时发生的,在执行过程中临时拼凑。

pwd cd .. . ls -al vim 

shell也是一个进程,自定义变量只能该进程中应用,环境变量可被子进程继承,用env可查看环境变量,PATH就是一个环境变量的名,echo $PATH 会有很多路径,输入ls就是在这些路径下找到ls并执行的,
还要告诉加载器,动态库的路径,否则会找不到,LD_LIBRARY_PATH环境变量,加载动态库dlopen(),dlsym()获取动态库中的某个函数地址,dlclose()引用计数减一,为0时从内存中卸载。
	
errno全局变量,发生错误时,系统会自动设置errno的值。
	
gcc -g *.c 生成的可执行文件加了调试信息,gdb a.out可进行调试,l 列出程序,b行号/函数名设置断点,r运行,p变量名来查看变量值,n执行下一条语句,s执行下一条,若有函数则进入函数内,q退出调试。

每个进程都有0-4G地址空间,CPU执行该进程被该进程独享,0-3G-1为用户空间 3G-4G-1 为所有进程共享的内核空间,0-3G-1分别为代码段,数据段,BSS段(未初始化的或者初始化为0的全局变量和静态变量的一块内存区域),堆(向上),.SO(动态库文件)文件映射区,栈(向下)。虚拟地址空间是32位寻址4G,但内存条可能才1G,通过页表(逻辑地址与物理地址对应表)管理,由操作系统维护,如一个房间给4个客人住,打时间差。

栈帧包含返回地址,被保存的寄存器的值,栈帧内的局部变量(生命周期为该函数生命周期,作用域在当前栈帧)。

内存映射默认大小为虚拟地址上的4K,用mmap函数,可以用文件映射,也可用内存条映射,用mmap将文件映射到虚拟地址空间,对虚拟地址的操作反应到文件中,就不用read write了,munmap取消映射。 
	
fopen fclose fwrite fread有缓存,open close read write lseek无缓存,fopen()调用过程发生了什么?
1.调用了malloc分配了块缓存区,分别有用于读和用于写的。
2.调用open打开一个文件,返回其描述符。
3. fgetc(),缓存区有数据就直接获取,否者先调用read使缓存区有数再获取。
4. fputc(),缓存区有空间就直接写入,否者调用write将缓存中内容写入文件,清除缓存区,再写入内容到缓存区中。

文件描述符fd,每个进程有pid还有PCB(进程控制块)PCB在1G内核空间中,它记录了每个进程的资源使用情况,比如有下标0=stdin_fileno,下标1=stddout_fileno,下标2=stderr_fileno,这个下标就是文件描述符。

rwxr--r-- 读写可执行,分别对应属主、属组、其他人,chmod a+x add.c,一般用来修改.sh脚本文件。
	
stat filename查看文件元数据,文件的inode号,每个文件都有且一个inode,但一个inode可对应多个文件,cat filename查看文件内容,inode存储了文件的元数据和在硬盘的数据块的编号,若A和Binode相同,则是硬链接,而软连接是:a与binode不同,a的inode指向b的inode,删了b的话cat a会报错。

文件夹操作:opendir closedir readdir()返回其中的一个文件的指针,..上级目录 .当前目录,文件重定向 cat hello.c > abc.c ,调用了dup()。

某进程对某文件上文件锁:读锁(共享),写锁(互斥),fcntl()。
	
fork()创建子进程,父进程返回子进程pid,子进程返回0,两个进程的PCB一样,调用完后两个进程
if(pid==0{}   else {} ,两个进程执行不同代码,ps -aux 查看所有进程信息,ps -aux | grep.....  查找,
父进程用wait()回收子进程资源,若父进程先死,子进程的父进程变成init进程,此子进程叫孤儿进程,若子进程死,父进程没来得及回收,此时子进程叫僵尸进程,kill -9 pid可杀死进程,fork()后父子进程代码段一样,用exec函数可以给子进程加载新代码段执行,在bash上执行a.out,其实就是bash先fork再exec。
	
管道:有名管道(可以理解为一个管道文件),无名管道(存在于1G内核空间中,用于具有亲缘关系的进程间通信,父进程创管道后(此时有两个文件描述符分别用于读写),fork(此时pcb被复制一份),父关写端子关读端,然后子写父读。
	
信号:ctrl+c,ctrl+\,SIGSEGV是段错误时,系统给进程发的信号,还有 SIGALRM等,信号处理函数默认为终止进程,可自己设置,在pcb中有128个blocking位和128个pending位(信号未决,产生了但还没到)和128个函数地址位,针对不同的信号进行处理。
可靠信号和不可靠信号:1-31是不可靠信号,阻塞期间,发了n次信号,只会响应一次。

可重入函数 :空间只在栈帧。
	
前台作业与后台作业:kill -9 可杀死后台进程而 ctrl+c ctrl+\只可杀死前台作业。
	
用key值可获取被绑定的位于内核空间的用于进程间通信的消息队列的id,向消息队列发消息和从消息队列中移除消息,共享内存也可用于进程间通信,也有key和id,都是从用户区向内核空间的映射,一个内核区域映射到多个进程的用户区域,操作用户空间就相当于操作了公共的共享内存区域。
	
有以太网和令牌环网两种网卡两种网帧,它们IP包一样的,只是IP包外面那层装备变了,一般在出网的时候用。
     
tcp/ip 协议簇,应用层 HTTP等,传输层 TCP.UDP等(16位源端口号和16位目的端口号),网络层 IP等,链路层(链路层(规定网帧格式)+ 物理层(规定网卡接口大小)),网帧:比如包含 源MAC地址 目的MAC地址 源IP地址 目的IP地址(ip地址32位 网卡地址48位),用ifconfig可查看,MAC地址在传输过程中会一直变,内容经过每一层穿个衣服,到了目的地,经过每一层脱个衣服。
      
上层是用户进程,处理应用程序细节;下层是内核,处理通信细节;交换机交换的是网帧,网段不会变,比如在一个局域网里面;路由器交换的是IP包,比如从以太网进入了令牌环网,先脱衣服到IP层再穿一层衣服。
IP地址包含:网络号和主机号和子网掩码,一个交换机可以接很多机器,比如192.168.1.3  192.168.1.4 192.168.1.5  192.168.1.1(网关),网关通过路由器接到外部,传输后又经过另一个网关和路由器接入其他网段中,这个过程中IP地址不变,但MAC地址一直在变。
	
三次握手:   SYN     ACK+SYN  ACK
四次挥手: FIN ACK ACK+FIN ACK

2xx表示成功响应,3xx表示重定向,4xx表示客户端错误,5xx表示服务器错误。

数据传输:
1 判断目标IP地址与自己IP地址是否在一个网段;
2 路由表查看是否需要出网;
3 arp表查目标IP对应的MAC地址;
4 若有直接给过去,若无,发广播询问谁的IP地址是,目标机器把自己的MAC地址回复回去,再发数据。

基于TCP网络编程:
服务端:
listenfd 监听套接字 ,connfd 连接套接字,先socket(创建套接字),再bind(与端口和IP地址绑定),然后listen(),再然后accept(会阻塞,产生连接套接字),最后处理数据read、write、close(关闭连接),网络传输采用大端。

客户端:创建套接字 connect(连接到对应IP和端口号的服务器)。
	
TCP面向连接的,面向数据流的,保证了传输正确性,因为有三握四挥;UDP面向包的,不负责正确性,但传输快,如音视频用。
	
基于UDP的编程:
服务端:
创建套接字 bind()recvfrom(阻塞)sendto(地址可从recvfrom的返回值获得)。
	
线程:线程共享进程的资源,有自己的tid,每个线程有自己的栈帧,可把main()理解成主线程,return后,主线程结束,pthread_create(),pthread_join()阻塞等待收尸,pthread_detach(指定一个线程是分离属性,它结束了自动回收)。

线程对临界资源的访问要同步:mutex锁,是变量类型,可以定义多个不一样的:
1、初始化锁变量 2、加锁 3、操作 4、解锁;条件变量cond也是变量类型,可以定义多个不一样的和mutex搭配使用 pthread_cond_wait() 解锁等待条件变量为真再加锁。
	
生产者消费者模型:加锁,如果是空,调用pthread_cond_wait()阻塞等待,当生产者产好了调用pthread_cond_signal(cond) ,通知条件变量然后再解锁。 

信号量:有用于多进程的,也有用于多线程的,sem_post(使值+1),sem_wait(使值-1,若已经为0,则等待),sem_t 是信号量类型,信号量集是进程间通信的,是信号量的集合,包含多个信号量,信号量集在内核空间中的,和消息队列、共享内存一样也有key和id。

ping、netstat

发现一个服务报错磁盘满了,写不进去,我会用哪些命令去看? 用df命令。

select和poll :都是内核用户态来回拷贝,返回后还要遍历,但poll是链表,select是数组。
epoll : 红黑树 ,回调机制,将触发了的加到就绪链表中,内存映射不拷贝。

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yo_fake_jay

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值