linux面试常考题目

    技术2022-07-11  72

    在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

    Processed: 0.012, SQL: 12