文章目录
- 1.进程环境----子进程继承父进程的那些东西
- 2.父进程和子进程之间的区别
- 3.fork的两种用法
- 4.进程启动和终止的方式
- 5.main return和exit和_exit进程终止有什么区别
- 6.c的存储空间布局是如何划分
- 7.父进程想到等待子进程完成在继续运行需要怎么做
- 8.进程替换的接口有几种,有哪些区别
- 9.标准I/O和文件I/O有什么区别
- 10.缓存区的类型和刷新缓存区的方法
- 11.文件的元信息和文件类型
- 12.如何得到文件拥有者的名字
- 13.如何读目录
- 14.什么是守护进程
- 15.守护进程的编程规则
- 16.vfork和fork的差别
- 17.匿名管道的特征
- 18.守护进程出错怎么记录
- 19.会话,进程组,进程的关系
- 20.标准信号默认行为
- 21.如何产生信号
- 21.什么是信号集
- 22.标准信号有什么特点
- 23.为什么不能用longjmp函数?
- 24.如何忽略掉一个信号的?
- 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 只要文件名,不需要行路径
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()
14.什么是守护进程
- pid和ppid和pgid相同
- 不占用控制终端
15.守护进程的编程规则
1.调用umask将文件模式创建屏蔽字设置为一个已知值(通常是0)。
2.调用fork,然后使父进程exit。
3.要用一个非组长进程,调用setsid创建一个会话
4.将当前工作目录更改为根目录,chdir("/");
5.关闭不需要的文件描述符
6.打开/dev/null使其具有文件描述符0,1,2,使其不会产生效果
16.vfork和fork的差别
(1)fork :子进程拷贝父进程的数据段,代码段
vfork:子进程与父进程共享数据段
(2)fork父子进程的执行次序不确定
vfork保证子进程先运行
17.匿名管道的特征
-
有空间大小,只能进行单向通信;
-
只适用于有血缘关系之间的进程;
-
不能用lseek来定位文件偏移量
-
必须有读写双方
-
当进程读到一个空管道时会处于阻塞态,直到数据到来。没有写端,返回eof表示读完。
-
当进程写到一个满管道时会处于阻塞态,直到数据读走。没有读端只有写端,会产生信号结束进程
18.守护进程出错怎么记录
书写日志 openlog syslog closelog
19.会话,进程组,进程的关系
会话中有一个或多个进程组
一个进程组中有一个或多个进程
getsid()获得会话id
getpgid()获得进程组id
getpid()获得进程id
20.标准信号默认行为
- term:终止进程
- ign:忽略信号
- core:终止进程并产生dump文件 看不到文件是因为资源限制
- stop:暂停进程
- cont:继续进程
21.如何产生信号
(1)在终端按下组合键
Ctrl-C产生SIGINT信号
Ctrl-\产生SIGQUIT信号
Ctrl-Z产生SIGTSTP信号
(2)程序异常产生信号
(3)调用kill()或raise()
kill的第一个参数
pid<0 | 发送信号给pid绝对值所对应的进程组 |
---|---|
pid==-1 | 发送给进程有权限发送的系统中所有进程 |
pid==0 | 发送信号给与发送进程属于同一个进程组的所有进程 |
pid>0 | 发送信号给指定进程 |
21.什么是信号集
用某个数据类型去描述多种信号,这种数据类型被称为信号集
与信号集有关的函数
- sigemtpyset():把信号集中的所有信号都清0
- sigaddset():向信号集中添加信号
- sigdelset(s):在信号集中删除信号
- sigprocmask():设定对信号屏蔽集内的信号的处理方式(阻塞或不阻塞)
- sigappding:原子化设置信号集状态
22.标准信号有什么特点
- 能打断阻塞的系统调用
- 有默认行为
- 用位图显示信号结构
- 信号处理函数不能用longjmp函数跳转
- 信号处理函数用可重入函数
- 相应过程是嵌套的
23.为什么不能用longjmp函数?
信号处理函数结束后要将mask置为1
24.如何忽略掉一个信号的?
将mask置为0
25.标准信号为什么会丢失?
显示信号的结构时一个位图 只能被置1一次