在64位系统下,分别定义如下两个变量:char *p[10]; char(*p1)[10];请问,sizeof(p)和sizeof (p1)分别值为_80/8___。
重点理解p跟谁结合了,跟[]结合,则p就是一个数组;跟*结合,p就是一个指针; 首先[]()的优先级一样,均大于* char *p[10],p与[]结合,所以p就是一个数组,数组的元素比较特殊,是指针,指针大小为8,所以是10*8=80; char(*p1)[10],与*结合,所以是一个指针,大小为8 ----------------------- 进程和线程区别,进程通信方式 进程是资源分配的基本单位。 线程是独立调度的基本单位。 一个进程中可以有多个线程,它们共享进程资源。 进程间的通信方式, 1.管道(包括无名管道和命名管道) 2.消息队列 3.套接字 4.信号 5.共享内存 6.信号量 五种本地IPC通讯方式总结:
1.管道:速度慢,容量有限,只有父子进程能通讯
2.FIFO:任何进程间都能通讯,但速度慢
3.消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题
4.信号量:不能传递复杂消息,只能用来同步
5.共享内存区:能够很容易控制容量,速度快,但要保持同步,比如一个进程在写的时候,另一个进程要注意读写的问题,相当于线程中的线程安全, 当然,共享内存区同样可以用作线程间通讯,不过没这个必要,线程间本来就已经共享了同一进程内的一块内存 ------------------ 线程间通信(同步):1.互斥锁 2. 读写锁 3. 条件变量 4.信号量 ---------------------------------------------- 内存分配方面: 堆:一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式是类似于链表。可能用到的关键字如下:new、malloc、delete、free等等。 注意:容易溢出内存 栈:由编译器(Compiler)自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 ----------------------- #include<stdio.h>
int main() { int a[5] = { 1, 2, 3, 4, 5 }; int *p = (int *)(&a + 1); printf("%d,%d", *(a + 1), *(p - 1)); return 0; } 2,5 ———————————————— 内核和用户空间通信方式 1.系统调用 2.ioctl接口 3.netlink是一种特殊的socket 4.sysfs(/sys) 是 Linux 2.6 才引入的一种虚拟文件系统 5.procfs(/proc) 是 进程文件系统 的缩写,它本质上是一个伪文件系统 6.sysctl(/proc/sys) sysctl 是一个 Linux 命令, 7.seq_file 8.debugfs 9.relayfs --- 1.系统调用:提供一种便捷的用户和内核间的交互方式,一般用于调试日志以及配置参数 2.虚拟文件系统 proc文件系统 sysfs文件系统 debugfs文件系统 :提供一种便捷的用户和内核间的交互方式,一般用于调试日志以及配置参数
缺点:不够实时,无法传输大数据量 使用:创建proc文件驱动,然后像操作文件一样操作,驱动负责解析应用层的read write 请求 3.ioctl接口:不能交换大量的数据
4.netlink:提供了一组类似于BSD风格的API,用于用户态和内核态的IPC。相比于其他的用户态和内核态IPC机制,
优点:1.使用自定义一种协议完成数据交换,不需要添加一个文件等。2.可以支持多点传送。3.支持内核先发起会话。4.异步通信,支持缓存机制。
缺点:无法传输大数据量,例如视频数据
5.共享内存:效率高,可以交换大量数据,但是进程间的同步复杂 --------------- 其中模块参数与sysfs、procfs、debugfs、relayfs是基于文件系统的通信机制,用于内核空间向用户控件输出信息; sysctl、系统调用是由用户空间发起的通信机制; Netlink是基于socket的通信机制,由于socket本身的双共性、突发性、不阻塞特点,因此能够很好的满足内核与用户空间 小量数据的及时交互,因此在Linux 2.6内核中广泛使用,例如SELinux,Linux系统的防火墙分为内核态的netfilter和用户态的iptables, netfilter与iptables的数据交换就是通过Netlink机制完成。 -------------- 比如用192.168.1.0/24网段来划分子网bai:第一段:du192.168.1.0/27, 即掩码为255.255.255.224,主机地zhi址范围:192.168.1.1-192.168.1.30; 第二段:192.168.1.32/27,主机地址范围:192.168.1.33-192.168.1.62; 第三段:192.168.1.64/27,主机地址范围:192.168.1.65-192.168.1.94; 第四段:192.168.1.96/27,主机地址范围:192.168.1.97-192.168.1.126; 第五段:192.168.1.128/27,主机地址范围:192.168.1.129-192.168.1.158; 第六段:192.168.1.160/27,主机地址范围:192.168.1.161-192.168.1.190。 ----------------------- 由于Linux进程分为用户空间和内核空间两个部分,它有时运行于用户空间,有时运行于内核空间,因此为了保护各自的现场数据,一个进程还需要两个堆栈:用户堆栈和系统堆栈 ---------------------- .用户态如何切换到内核态? 用户态切换到内核态分两种:主动式和被动式 被动式:就是Linux在用户态(ARM在用户模式)工作,没有主动发起请求、而被动地进入内核态;包括硬件中断和程序异常。 主动式:就是Linux在用户态(ARM在用户模式)工作,通过发起用户态程序发起命令请求、ARM响应进入特权模式进而Linux切入内核态;就是系统调用。 --------------------------------- .用户态->系统调用->软中断->系统调用中断服务程序(传入系统调用号)->对应驱动程序。 -------------------------------------------- 有一个数组a[N]顺序存放0~N-1,要求每隔两个数删掉一个数,到末尾时循环至开头继续进行,求最后一个被删掉的数的原始下标位置。以8个数(N=7)为例:{0,1,2,3,4,5,6,7},0->1->2(删除)->3->4->5(删除)->6->7->0(删除),如此循环直到最后一个数被删除。 #include "stdafx.h" // ConsoleApplication12.cpp : 定义控制台应用程序的入口点。 //
#include<iostream> #include<vector> using namespace std;
void print(vector<int> vec) { for (int i = 0;i < vec.size();++i) { cout << vec[i] << " "; }
} int main() { vector<int> sources; vector<int> temp; int num; int flag; cin >> num; if (num > 1000) { flag = 1000; num = 1000; } else { flag = num; }
while (flag != 0) {
flag--; sources.push_back(flag);//从大到小存数据 }
//循环终止条件 int i = sources.size()-3; int deleteNum= 0;//记录删除节点的个数 temp = sources;
while (sources.size() != 1) {
// temp.clear();
num = 0; while (i>=0) { temp.erase(temp.begin() + i ); i = i -3 ; }
//cout << "sources:"; print(sources);cout << endl; // cout << "temp:"; print(temp);cout << endl;
if (i== -1) { i = temp.size()-1; } else if (i == -2) { i = temp.size() - 2; } else { i = temp.size() - 3; } sources = temp;
}
cout << sources[0] << endl;
return 0; }
//注意:遇到中循环删除指针的问题,可以倒着删除 ------------------ 单任务 c/s模式下 TCP、UDP通信的一般流程 应用层:socket fd 传输层:port 网络层:ip ------- 基于TCP的协议对应的应用层协议:
FTP:文件传输协议,使用端口21 Telnet:一种远程登录的端口,23. SMTP:邮件传送协议,用于发送邮件,端口:25 POP3:用于发送邮件。端口110 HTTP:是从Web服务器传输超文本到本地浏览器的传送协议。 基于UDP的协议:
DNS:域名解析协议,将域名转换位IP地址,端口号:53 SNMP:简单网络管理协议:使用161号端口,是用来管理网络设备的 TFTP:简单文件传输协议,该协议在熟知端口69上使用UDP服务
--------------------- 参考 https://blog.csdn.net/u012247418/article/details/80555416?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-11.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-11.nonecase https://blog.csdn.net/QQ2558030393/article/details/96307590?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.nonecase https://blog.csdn.net/vertor11/article/details/79622694?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-8.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-8.nonecase https://blog.csdn.net/Ivan804638781/article/details/79892619 https://blog.csdn.net/qq_38410730/article/details/81173170 https://blog.csdn.net/qq_42787645/article/details/102527123