首页 > 代码库 > 垂死挣扎-3

垂死挣扎-3

mode有以下几种方式:

打开方式说明
r以只读方式打开文件,该文件必须存在。
r+以读/写方式打开文件,该文件必须存在。
rb+以读/写方式打开一个二进制文件,只允许读/写数据。
rt+以读/写方式打开一个文本文件,允许读和写。
w打开只写文件,若文件存在则长度清为0,即该文件内容消失,若不存在则创建该文件。
w+打开可读/写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
a以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留(EOF符保留)。
a+以附加方式打开可读/写的文件。若文件不存在,则会建立该文件,如果文件存在,则写入的数据会被加到文件尾后,即文件原先的内容会被保留(原来的EOF符 不保留)。
wb以只写方式打开或新建一个二进制文件,只允许写数据。
wb+以读/写方式打开或建立一个二进制文件,允许读和写。
wt+以读/写方式打开或建立一个文本文件,允许读写。
at+以读/写方式打开一个文本文件,允许读或在文本末追加数据。
ab+以读/写方式打开一个二进制文件,允许读或在文件末追加数据。
 
 
三元运算符,问号前面是表达式,如果表达式为true就返回问号后面的,否则就返回冒号后面的。这题a=5?0:1,条件表达式为是数字5,这个数是大于0的数,为真,所以返回问号后的表达式0

对于 a[3][4],a是一个指针数组,大小为3,里面三个元素就是该二维数组的每一行第一个元素的地址。
1、*(a[2]+1),   a[2]就是第三行首元素的地址,a[2]+1 则地址向右偏移1,*(a[2]+1)就是取该地址的元素,也就是a[2][1]
2、*(*(a+2)+1), *(a+2) 和a[2]是等价的。所以*(*(a+2)+1)也是表示a[2][1]
 
下列程序的打印结果是?
1
2
3
char p1[15]= "abcd",*p2= "ABCD", str[50]= "xyz"
strcpy(str+2,strcat(p1+2,p2+1)); 
printf("%s",str);
strcat(p1+2,p2+1); //返回以p1+2为首的字符串,即"cdBCD"strcpy(str+2,strcat(p1+2,p2+1)); //将"cdBCD"copy到str+2位置上,并覆盖后面的内容,此时str为"xycdBCD"

以下程序的输出结果是? 
1
2
3
4
5
6
7
#include <stdio.h> main()
{
    char a[10]={ ‘1‘,‘2‘,‘3‘,‘4‘,‘5‘,‘6‘,‘7‘,‘8‘,‘9‘,0},*p; int i;
    i=8;
    p=a+i;
    printf("%s\n",p-3); 
}
1、p指向a[5]
2、“%s”输出直到‘\0‘的字符串
3、最后的0为数字而非字符‘0’,ASIIC码中0为空字符
 
所以输出的结果是   6789  而不是6789
 
++ 是一目运算符,自增运算,它只能用于一个变量,即变量值自增1, 不能用于表达式。++(a++) 里,小括号优先。(a++) 是 表达式,按运算规则,不能对 表达式 作 自增运算.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
ARP -s inet_addr eth_addr [if_addr]
 
ARP -d inet_addr [if_addr]
 
ARP -a [inet_addr] [-N if_addr] [-v]
 
 
 
  -a            通过询问当前协议数据,显示当前 ARP 项。
 
                如果指定 inet_addr,则只显示指定计算机
 
                的 IP 地址和物理地址。如果不止一个网络
 
                接口使用 ARP,则显示每个 ARP 表的项。
 
  -g            与 -a 相同。
 
  -v            在详细模式下显示当前 ARP 项。所有无效项
 
                和环回接口上的项都将显示。
 
  inet_addr     指定 Internet 地址。
 
  -N if_addr    显示 if_addr 指定的网络接口的 ARP 项。
 
  -d            删除 inet_addr 指定的主机。inet_addr 可
 
                以是通配符 *,以删除所有主机。
 
  -s            添加主机并且将 Internet 地址 inet_addr
 
                与物理地址 eth_addr 相关联。物理地址是用
 
                连字符分隔的 6 个十六进制字节。该项是永久的。
 
  eth_addr      指定物理地址。
 
  if_addr       如果存在,此项指定地址转换表应修改的接口
 
                的 Internet 地址。如果不存在,则使用第一
 
                个适用的接口。
 
示例:
 
  > arp -s 157.55.85.212   00-aa-00-62-c6-09.... 添加静态项。
 
  > arp -a                                  .... 显示 ARP 表。
 
 
虚拟内存的作用同物理内存一样,只不过是从硬盘存储空间划出的部分,来完成内存的工作,由于不是真正的内存,所以被称为虚拟内存。因为计算机所支持的最大内存是由该计算机的地址位数决定的,也就是计算机的最大寻址能力。例如,32位机的寻址能力为2的32次方,大约为4G。所以虚拟内存的大小也受计算机地址位数的限制。不过这到题单选D是由前提条件的,那就是磁盘空间足够大,否则严格意义上讲应该多一个选项A。

虚存的大小要同时满足2个条件:
1.虚存的大小  ≤ 内存容量和外存容量之和。
2.虚存的大小  ≤ 计算机的地址位数能容纳的最大容量。
 
 
在一个请求页式存储管理中,一个程序的页面走向为 4, 3, 2, 1, 3, 5, 4, 3, 2, 1, 5,并采用 LRU 算法。假设分配给该程序的存储块个数 M 分别为 3 和 4,则该访问中发生的缺页次数 F 分别是?
LRU(最近最少使用)该算法实现中最常用的是链表这个数据结构,将即将插入存储块的页面P与存储块中页面比较,如果存储块中已经存在页面P,则将链表中的页面P置于表头,不然缺页次数+1,如果这时链表长度达到目标值(存储块满),则去掉链尾的页面(也是最近最少使用的页面),并将页面P插入链表头。
例如存储块长度为3的时候,页面访问顺序为4, 3, 2, 1, 3, 5, 4, 3, 2, 1, 5
访问            链表              缺页+
4                    4                   1
3                   34                  1
2                  234                1
1                  123                1
3                  312                0
5                  531                1
4                  453                1
3                  345                0
2                  234                1
1                  123                1
5                  512                1
所以当存储块为3时候,最后统计缺页次数为9次

 

 
第三范式需要确保数据表中的 每一列数据都和主键直接相关,而不能间接相关 。
第一范式:原子性,字段不可分割
第二范式:没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的一部分。
第三范式:不能存在传递依赖
 
 
RSA一般为1024或2048位
运行速度:RSA<AES
安全性依赖于大数分解
RSA非对称加密算法
 
 
假设在 n 进制下,下面的等式成立,n 的值是? 
567*456=150216
直接看俩数最后一位,7×6=42,除以9和18都余6,所以9和18俩答案中的一个 再看,按十进制计算567×456=258552 比 150246(n进制)要大,所以n要比十进制要大,所以选择18进制。
 
假设n进制,则有(5*n   2   +6*n+7) * (4*n   2   +5*n+6) = n     5     +5*n   4   +2*n   2   +n+6,简化以后可以得到
15*n 4 +49*n 3 +86*n 2 +70*n+36=n 5 ,两边同时除以n 5 ,可以得到15/n+49/n 2 +86/n 3 +70/n 4 +36/n 5 =1;
要让等式成立,n肯定是大于15的,所以选D。
 
567*456=(5n^2+6n+7)*(4n^2+5n+6)=20n^4+49n^3+88n^2+71n+42 ....(1) 
150216=n^5+5n^4+2n^2+n+6 ...............................(2) 
//[x]表示对x取整 
则: (1)式对n取模=42 mod n ...(3) 
   (2)式对n取模=6 ...........(4) 
由(1)=(2),综合(3),(4)式得: 
   42 mod n=6 (5) 
设 a=[42/n] ,则由(5)式子得: 
   a*n=36       (6) 
由(6)可解得 n=9,12,18,36 .......(7) 

   [(1)/n] mod n=[(2)/n] mod n 
=> [71+42/n] mod n=1.........(8) 

把(7)的解代入(8),检验可得n=18.
 
 
 
 
数据包传递过程:
在网络层IP数据包向上传递的时候会查看数据包中的协议类型
如果协议类型是TCP,则交给TCP
如果协议类型是UDP,则交给UDP
到了传输层,再根据端口号将数据传送到应用层相应的应用程序,TCP、UDP端口是独立的
所以D是错的 
实际上当TCP和UDP提供相同的服务时,会选用相同的端口号(应该是为了方便吧)
技术分享 
说明:图片截自TCP/IP协议详解
 
TCP、UDP可以绑定同一端口来进行通信。
类似于文件描述符,每个端口都拥有一个叫端口号(port   number)的整数型标识符,用于区别不同端口。由于TCP/IP传输层的两个协议TCP和UDP是完全独立的两个软件模块,因此各自的端口号也相互独立,如TCP有一个255号端口,UDP也可以有一个255号端口,二者并不冲突。 
参考:http://nigelzeng.iteye.com/blog/1209538
 
 
 mac地址是物理地址,它是不会改变的;
 
    由于IP地址包含了不同的网络段,
 
    所以,不同的网络中ip地址要变化,
 
    否则无法进行解析,也就无法与其他主机进行通信。
 
 
关于 Linux 系统上同一个程序的多个进程实例共享一个 TCP 监听端口的说法, 哪个不正确?
每个进程都使用 SO_REUSEPORT 选项,然后绑定同一个地址和端口
每个进程分别绑定不同的网卡地址的同一端口
第一个进程先绑定到监听地址端口, 然后 fork 子进程共享使用
每个进程分别绑定一次, 但只有最后一个调用的进程才能收到数据

在没有SO_REUSEPORT 之前都是使用fork来让多个进程监听同一端口。AC对。
D,确实只有一个进程收到数据,但是是多个进程竞争连接请求。
B正确
 
D是竞争调度的结果,而不是最后调用的进程收到数据。
A使用SO_REUSEPORT,绑定统一地址和端口。
B分别绑定 不同的网卡地址的同一端口,TCP的四元组并不冲突。
C使用fork创建子进程共享,也没有问题。

垂死挣扎-3