【面试】C语言面试题二

转载自:https://blog.csdn.net/Xiao_peng117/article/details/76651444

  1. 1 大致描述一个进程在内存中的分布情况
    1)代码区:储存程序代码

2)data段:已初始化的全局变量和static变量以及常量字符串。程序结束后自动释放

3)bss段:未初始化的全局变量和static变量

4)栈区:局部变量

5)堆区:程序中动态分配的内存

代码区

data段

bss段

堆区

栈区

1.2 heap和stack的区别
heap(堆区)stack(栈区) 并不是数据结构中的堆和栈
堆区空间需要自己开辟自己释放,栈区由系统自动分配和释放

  1. 如何查看一个正在运行的程序的内存分布

终端输入命令cat /proc/[pid]/maps

maps文件保存的就是进程内存分布情况。

  1. 如何在一个程序里创建一个新进程

fork():子进程和父进程运行顺序无法确定

vfork():父进程会阻塞,等待子进程调用exec或exit之后,父进程才会运行。若子进程的运行需求于父进程的下一动作,则会导致死锁。

  1. 进程间哪些资源是共享的,哪些是独有的

fork()后的父子进程会共享正文段和文件共享,不共享数据段和堆栈空间。

  1. 进程间有哪些通信机制(IPC)

1)管道:

(1) 只能用于公共祖先的两个进程

(2) pipe()创建匿名管道;mkfifo创建有名管道FIFO.

2)消息队列

(1)ftok -> key_t   获取key值

(2)msgget -> mgid  得到一个实例消息队列

(3)msgrcv/msgsen   接收发送数据

(4)msgctl         销毁

3)共享内存

(1)shmget     获取实例(key,大小,要求)

(2)shmat      映射地址

(3)shmdt      解除映射

(4)shmctl     移除

4)信号量:是一个计数器,为多个进程提供对共享数据对象的访问,常作为锁,防止多个进程同时访问一个资源

5)信号量数组

(1)ftok       获取key值

(2)semget     得到实例(key,信号量个数,要求)

(3)semop      操作

(4)semctl     放置信号灯/销毁

6.按下ctrl+c会导致进程结束,为什么?

给前台进程发送信号:SIGINT信号,(2)号信号

7.如果在bash里输入./a.out回车之后发生了哪些事情

bash调用fork()创建一个子进程,在子进程中执行a.out,并等待子进程结束

(1) bash调用fork()

(2) sys_execve进行参数的检查复制

(3) do_execve检查文件是否存在

(4) prepare_binprm进行文件格式判断

(5) search_binary_handler根据文件格式搜索装载程序

(6) load_elf_binary装载程序开始执行可执行文件

8.如何在一个程序里创建一个新线程

pthread_creat()

由于pthread库不是linux默认库,所以编译时要加-lpthread

9.线程间哪些资源是共享的?哪些是独有的?

线程共享gid,uid,文件描述符,堆空间。

线程有独立的栈,局部变量,寄存器,程序计数器,线程ID。

10.线程同步有哪些机制?

互斥量:引入锁,得到锁的执行操作,未得到锁的等待,不能共享数据。

条件变量:触发条件才会执行,等待条件挂起线程直到其他线程触发条件

信号量

11.描述网络协议的分层概念,以及常用TCP/IP协议族的大致框架结构

osi七层结构

TCP/IP四层

应用层

应用层(http/ftp)

表示层

传输层(udp,tcp)

会话层

网络层(ip)

网络层

数据链路层

传输层

(物理层)

数据链路层

物理层

12.简述TCP/IP协议簇中的TTL,SEQ,SYN,ACK,FIN,MTU是什么?

TTL:网络数据包的生存周期

SEQ:

SYN:表示建立连接(TCP格式段的标志位)

ACK:表示响应 (TCP格式段的标志位)

FIN:关闭连接(TCP格式段的标志位)

MTU:传输数据包的最大字节数

13.描述三次握手,四次挥手,为什么要握手三次呢?

1)

客户端向服务器端发送SYN包,请求连接;

服务器端向客户端发送SYN+ACK,为连接分配资源;

客户端为连接分配资源,并回复ACK。

2)

客户端向服务器端发送FIN报文,请求断开连接;

服务器端回复ACK,并进入wait状态;

服务器端确认数据传输完毕,发送FIN报文

客户端收到回复ACK,断开连接。

3)

为了防止因为延迟,使服务器端再进入等待连接状态而浪费资源。

14.常用socket通信大致需要哪几个步骤

1)UDP

主动段                      被动端

socket()                   socket()

sendto()                  bind()

close()                     recvfrom();

                                 close();

2)TCP

主动段                 被动段

socket()                socket()

bind()//可省略       bind()

connect()               listen()//监听请求连接

                                accept()//接受请求

send()/write()        recv()/read()

close                  close()

15.什么情况下适合用UDP,什么情况下适合用TCP

1)UDP

    提供高效率服务;如音频和多媒体应用

2)TCP

提供稳定的服务;需要可靠稳定的连接时,如远程登陆,文件传输

16.在后台静默的ping某个ip地址,命令行该如何输入

ping xxx.xxx.x.xxx

17.c语言源代码变成a,out经历哪些过程

C语言编译大致过程:预处理 -->编译 -->汇编 --> 可执行文件

具体过程:预处理 -->编译优化 -->汇编 -->链接过程 --> 可执行文件

格式变化:.c -->.i -->.s -->.o -->可执行文件

19.udp如何确认被动端已收到数据

被动端用recvfrom来接收数据,如果成功接收数据,返回接收到的字节数,若失败则返回-1.

20.线程和进程的区别

1.进程是程序的执行过程,线程是进程的一个执行路径

2.在系统中,进程是系统资源分配的单位,线程是CPU调度的单位

3.进程之间不共享资源,线程会共享所属进程的地址空间和其他资源

4.进程切换开销大,线程较小

21.线程和进程的应用场景

1.当需要频繁销毁核创建时就用线程
2.单应用多任务时

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值