题目集合4

1.“栈 stack”和“堆 heap”有什么区别,写两个函数分别在栈上和堆上分配内存,在堆上分配内存应注意哪些问题?
堆由程序员手动分配内存和释放,栈由系统自动分配和释放,
void fun1()
{
int p =(int ) malloc(3*sizeof(int));
free(p);
}
void fun1()
{
int p;
}
在堆上分配内存有可能失败,需要检测是否分配成功,另外用完了要,记得释放内存,否则会造成内存泄露。
2. 信号量是什么?有什么区别?使用信号量进行任务间通信有何优缺点?
信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问某共享资源时,其他进程也访问该资源。
信号量是进程间,进程里线程之间访问共享资源同步的一种手段,信号用于通知和接收进程某个时间发生。优点: 缺点:不能进行复杂信息的传递。

3.TCP/IP通信建立的过程怎样,端口有什么作用?
主机A发送SYN(seq=x)报文给主机B,主机A进入SYN_SEND状态 ;
主机B收到SYN报文,回应一个SYN(seq=y)ACK(ACK=x+1)报文,主机B进入SYN_RECV状态;
主机A收到主机B的SYN报文,回应一个ACK(ACK=y+1)报文,主机A进入established状态。
三次握手完成,主机A和主机B已经建立连接。
四次断开:
某个应用进程先调用close,称该端执行“主动关闭”(active close)。该端的TCP发送一个FIN分节,表示数据发送完毕;
接收到这个FIN的对端执行“被动关闭”(passive close),这个FIN由TCP确认。
一段时间的等待后,接收到这个文件结束符的应用进程将调用close关闭它的套接字,所以它的TCP也发送一个FIN。
接收到这个最终FIN的原发送端TCP(主动要求关闭连接的那一端)确认这个FIN。
因为每个方向都需要一个FIN和ACK,所以断开需要4个次连接。
端口号用来区分不同服务,如WEB服务,FTP服务对应的端口号不一样。

4.进程间的通信方法,比较其优缺点
管道,信号,消息队列,信号量,共享内存,套接字
管道是一种半双功通信方式,无名管道只允许具有亲缘关系的进行进行通信,有名管道允许无亲缘关系的进程间通信。缺点:数据只能单向流动,另外缓冲区的大小是有限,只能传递无格式字节流。
信号:是软件层次上对中断机制的一种模拟,用于接收和通知进程某时间的发生。
消息队列:它客服了前两种信息量有限的缺点,具有写权限的进程可以向消息队列中按照一定的规则添加新消息。
共享内存:它使不同进程可以访问同一内存空间,不同进程可以看到对方进程中对共享内存中数据的更新,这种通信方式依靠某种同步机制,如互斥锁和信号量。
信号量:进程间,进程里线程之间同步的一种手段。
套接字:用于不同机器进程间通信。
5.什么是MTU,如何检测整个通信链路上的MTU值?
最大传输单元(Maximum Transmission Unit,MTU)是指一种通信协议的某一层上面所能通过的最大数据包大小,
ping -c (number) -M do -s (bytes) IP
用来确定是否要进行拆包。

6.请指出下面程序的错误

unsigned char i = 10;  
char b = 100;
char* p;
 void f(void)
 { 
  While(--i>=0)
   { 
   *(p++) = b; 
  }
 } 

p没有分配内存空间, i是无符号类型,会引起死循坏。

7.在socket编程过程中,对端A向应用程序B(应用程序B负责多个模块)发送数据,如果对端A shutdown,而应用程序B要忽略此信号,为什么?
A端关闭,如果B端不忽略此信号,B会向A反应发送一些应答数据,而A这时候已经关闭了,会产生sigpipe信号,而这个信号的默认处理方式是结束该进程。
8.(附加题,可选做)编程实现:
快速创建一个1G的文件,逆序读取文件
使用dd命令,
dd if=/dev/zero of=test bs=1M count=1024
在当前目录下会生成一个1G的test文件,文件内容为全0(因从/dev/zero中读取,/dev/zero为0源

#include <stdio.h>  
#include <stdlib.h> 
int main()
{

FILE *fp;
long int count,last;
system("dd if=/dev/zero of=test bs=1M count=1024"); //创建1GB的test文件
    if((fp =fopen("./test","rb")) == NULL)
    {
    printf("file is not existing\n");
    exit(1);
    }
 fseek(fp,0L,SEEK_END);
last=ftell(fp);
    for(count=1L;count<=last;count++)
    {          fseek(fp,-count,SEEK_END);         
           ch=getc(fp);                    
           putchar(ch);    
    }
fclose(fp);
return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值