2021-09-25 文件目录和进程基础

1.进程环境----子进程继承父进程的那些东西

  • 缓冲区
  • 环境变量
  • 虚拟地址空间
  • 存储映像
  • 共享库
  • 进程表象
  • 附属组ID
  • 进程组ID
  • 会话ID
  • 控制终端
  • 设置用户ID标识和设置组ID标志
  • 当前工作目录
  • 根目录
  • 文件模式创建屏蔽字
  • 信号屏蔽和安排
  • 对任一打开文件描述符的执行时关闭标志
  • 链接的共享存储端
  • 资源限制

2.父进程和子进程之间的区别

  • fork的返回值不同
  • 进程ID不同
  • 两个进程的父进程不同
  • 子进程tms_utime、tms_stime、tms_cuttime和tms_ustime的值设置为0
  • 子进程不继承父进程设置的文件所
  • 子进程的未处理闹钟被清除
  • 子进程的未处理信号集设置为空集

3.fork的两种用法

(1)网络模型中:一个父进程希望复制自己,使父进程和子进程同时执行不同的代码段

(2)类似shell应用:一个进程要执行一个不同的程序,子进程调用exec

4.进程启动和终止的方式

(1)启动方式

  • 内核有C启动历程,子进程通过exec用C启动历程替换子进程
  • 启动历程调用main函数使得整个历程启动起来

(2)终止方式

​ 5种为正常终止

  • 从main返回;

  • 调用exit:

  • 调用__exit或_Exit:

  • 最后一个线程从其启动例程返回:

  • 从最后一个线程调用pthread_exit 。

    异常终止有3种方式,它们是:

  • 调用abort ;

  • 接到一个信号;

  • 最后一个线程对取消请求做出响应。

5.main return和exit和_exit进程终止有什么区别

  • return是返回函数值并退出函数
  • exit结束之前会清理I/O缓存和终止处理程序
  • _exit直接终止程序

6.c的存储空间布局是如何划分

(1)栈空间

​ 用于存放局部变量,变量未初始化时为随机值

(2)堆空间

​ 用户动态分配和释放存储孔空间

(3)数据段

​ 包含了已初始化的全局变量和静态局部变量

(4)bss段

​ 存放未初始化的全局变量和静态局部变量,在程序开始之前,内核将此段中的数据初始化为0或空指针

7.父进程想到等待子进程完成在继续运行需要怎么做

用wait和waitpid

waitpid的第一个参数作用

pid<1 等待组ID等于pid绝对值的任一子进程
pid==-1 等待任一子进程
pid==0 等待组ID等于调用进程组ID的任一子进程
pid>0 等待组ID等于与pid相等的子进程

8.进程替换的接口有几种,有哪些区别

六种 execl execv execlp execvp execle execve

execl execlp execle 需要单独的参数,以空指针结尾

execv execvp execve 需要构造一个指向个参数的指针数组

execlp execvp 需要环境变量的path每一个路径,只要文件名,不需要行路径

9.标准I/O和文件I/O有什么区别

  • 标准I/O有缓存区 文件I/O没有缓存区
  • 标准I/O是库 文件I/O是系统调用
  • 标准I/O可以移植性好 文件I/O速度快
  • 标准I/O通过文件流标志打开的文件 文件I/O通过文件描述符标志打开的文件

10.缓存区的类型和刷新缓存区的方法

  • ​ 缓冲区:暂存空间,大多数情况下,缓冲区的存在是件好事,作用合并系统调用
  • ​ 行缓冲:stdout,换行时,满了时,强制刷新
  • ​ 全缓冲:默认,(只要不是终端设备,全采用全缓冲模式)满了时,强制刷新
  • ​ 无缓冲:stderr需要立即输出

11.文件的元信息和文件类型

(1)元信息

  • 文件的类型和权限
  • 用户ID
  • 组ID
  • 文件字节数
  • 文件块大小
  • 最后一次访问时间
  • 最后一次修改时间
  • 最后一次改变时间(属性)
  • 文件的设备编号

(2)文件类型

  • - 普通文件regular file
  • d 目录文件dirctory
  • b 块设备文件block device
  • c 字符设备文件character device
  • s 套接字文件socket
  • p 管道文件 pipe
  • l 链接文件link

12.如何得到文件拥有者的名字

​ 通过stat函数得到uid,getpwuid读出/etc/passwd每一个字段,其中包括用户名

13.如何读目录

​ opendir()得到一个目录流,通过目录流读取目录项中的每一个,通过readdir()得到目录项,多次调用时会偏移到每一个元素,当读到最后一个目录流,readdir()返回NULL,之后再closedir()

上一篇:管道通信(上)


下一篇:Arduino Due, Maple and Teensy3.0 的 W5200性能测试