笔试训练2

1.ls -al各列的含义

drwx------+  9 zyu  staff    306  8 19 21:15 Pictures
drwxr-xr-x+  6 zyu  staff    204  3 30 22:09 Public


第一列:文件的类型与权限
第一个字母代表文件类型:d目录,-文件,l链接文件,b设备文件里的可供存储的接口设备,c表示设备文件里的串行端口设备,如键盘鼠标等一次性读取设备
接下来三个一组,第一组为文件所有者权限,第二组为同用户组的权限,第三组为其他非本用户组的权限
第二列:有多少文件名连接到此节点(i-node)
每个文件都会将它的权限与属性记录到文件系统的i-node中,不过我们使用的目录树却是使用文件名来记录,因此每个文件名就会连接到一个i-node,这个属性记录的就是有多少不同的文件名连接到相同的一个i-node号码
第三列:所有者账号
第四列:文件所属用户组
第五列:容量大小,默认单位B
第六列:创建或最近修改日期
查看完整时间 ls -l --full-time

第七列:文件名


2./etc/services定义了网络服务的端口

3.linux的系统进程类型:

(1) 交互进程:由一个shell终端启动的进程,在执行过程中,需要与用户进行交互操作,可以运行于前台,也可以运行在后台。 

(2) 批处理进程:该进程是一个进程集合,负责按顺序启动其他的进程。    

(3) 守护进程:守护进程是一直运行的一种进程,经常在linux系统启动时启动,在系统关闭时终止。它们独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件。例如httpd进程,一直处于运行状态,等待用户的访问。还有经常用的crond进程,这个进程类似与windows的计划任务,可以周期性的执行用户设定的某些任务。


4.kill 9的含义 sends SIGTERM to the process whose PID is 9

5.系统调用与库函数的区别

库函数是语言本身的一部分,而系统函数是内核提供给应用程序的接口,属于系统的一部分。
函数库调用是语言或应用程序的一部分,而系统调用是操作系统的一部分。
用户应用程序访问并使用内核所提供的各种服务的途径即是系统调用。在内核和用户应用程序相交界的地方,内核提供了一组系统调用接口,通过这组接口,应用程序可以访问系统硬件和各种操作系统资源。 
1.系统调用是为了方便应用使用操作系统的接口,而库函数是为了方便人们编写应用程序而引出的,比如你自己编写一个函数其实也可以说就是一个库函数。
2.系统调用可以理解为内核提供给我们在用户态用的接口函数,可以认为是某种内核的库函数。

3.read就是系统调用,而fread就是C标准库函数.


6.sizeof与strlen的区别

int   a=strlen(str); /*a=10;strlen 计算字符串的长度,以\0'为字符串结束标记。 

int   b=sizeof(str); /*b=20;sizeof 计算的则是分配的数组str[20] 所占的内存空间的大小,不受里面存储的内容影响


7.c语言分配内存的方式有哪些

内存分配方式有三种:
  1、从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。
  2、在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。

  3、从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由程序员决定,使用非常灵活,但如果在堆上分配了空间,就有责任回收它,否则运行的程序会出现内存泄漏,频繁地分配和释放不同大小的堆空间将会产生堆内碎块。

常见错误:

1.内存分配未成功,但使用了。

2.内存分配成功,未初始化就使用了     

3.内存分配成功,并且初始化,但内存越界

4.忘记释放内存,内存泄露

5.释放了内存,依旧使用


8.什么是野指针,如何避免

1.访问了没有权限的内存

2.访问了已释放的内存

3.指针未初始化

一、对指针进行初始化

①将指针初始化为NULL。

char *   p  = NULL;


②用malloc分配内存

char * p = (char * )malloc(sizeof(char));

③用已有合法的可访问的内存地址对指针初始化

char num[ 30] = {0};

char *p = num;


二、指针用完后释放内存,将指针赋NULL。

delete(p);

p = NULL;


注:

malloc函数分配完内存后需注意:

①检查是否分配成功(若分配成功,返回内存的首地址;分配不成功,返回NULL。可以通过if语句来判断)


②清空内存中的数据(malloc分配的空间里可能存在垃圾值,用memset或bzero 函数清空内存)

void bzero(void *s, int n);
s是 需要置零的空间的起始地址; n是 要置零的数据字节个数。


void memset(void *start, int value, int size);
如果要清空空间的首地址为p,
value为值,size为字节数。

8.与零的比较

bool规定为ture和false,但是关于ture值的定义在不同的环境和系统中,定义可能不同,C++中规定ture为1,但是VB中规定ture为-1,所以不要把bool类型的变量与ture、1、-1、0直接进行比较,这很有可能会造成程序错误。正规的写法为:



if(flag)


或者if(!flag),其中flag为bool类型。


2、整型变量和0值的比较


if(value==0)


if(value!=0),其中value为整型变量


3、浮点(float和double)变量和0值的比较


浮点变量在计算机中表示时有一定的精度和范围,如果超出精度限制,则计算机会进行截断处理,所以在计算机中不能直接用==和!=来直接对两个浮点数进行比较(注意:这里所谓的不能并不是说不可以这样写,实际上如果这样写编译器是不会报错的,但是很可能会导致程序不按我们预期的结果执行,所以为了避免错误的发生,还是不要这样写的好)


两个浮点数正确的比较方法为:


if(abs(a-b)<=EPSILON),


if(abs(a-b)>EPSILON),其中EPSILON为精度


同理浮点数与0值比较的正确方法为


if(abs(x)<=EPSILON),


if(abs(x)>EPSILON)


或者,如果不知道精度的情况下,可以这样写: if((a>=-0.0001)&&a<=0.00001)) ,如果这个if的条件为真,就代表a是等于0的。(因为float型是保证5位小数有效的,double是保证13位小数有效的。)


4、指针变量和0值的比较


if(p==NULL)


if(p!=NULL)

你可能感兴趣的:(笔试训练,笔试训练)