Linux C 编程 第七章习题
来源:互联网 发布:淘宝7 怎么设置 编辑:程序博客网 时间:2024/05/16 12:48
1、进程中的全局数据段、局部数据段,静态数据段分别位于哪个内存地址空间?
Linux 中一个进程由3部分组成:代码段、数据段、堆栈段。
代码段存放可指向的代码。
数据段存放程序的全局变量、常量、已被初始化的静态变量。未被初始化数据段(bss段):存放未被初始化的静态变量
堆栈段中的 堆 用于存放程序运行中动态分配的内存变量,栈用于函数调用存放函数的参数、函数内部定义的局部变量。
(正在运行的程序,叫进程。每个进程都有完全属于自己的,独立的,不被干扰的内存空间。此空间,被分成几个段(Segment),分别是Text, Data, BSS, Heap, Stack。用户进程内存空间,也是系统内核分配给该进程的VM(虚拟内存),但并不表示这个进程占用了这么多的RAM(物理内存)。这个空间有多大?命令top输出的VIRT值告诉了我们各个进程内存空间的大小(进程内存空间随着程序的执行会增大或者缩小)。还可以通过/proc//maps,或者pmap –d 了解某个进程内存空间都分布。)
2、子进程与父进程属性的异同?
父子进程共享代码段,子进程还获取父进程的数据段、堆、栈的复制。
*子进程有他自己唯一的ID。
*fork的返回值不同,父进程返回子进程的ID,子进程则返回0。
*子进程的父进程ID为创建它的父进程ID。
*子进程共享父进程进程打开的文件描述符但父进程对文件描述符的改变不会影响子进程中的文件描述符。
*子进程不继承父进程设置的文件锁。
*子进程不继承父进程设置的警告。
*子进程的未决信号集被清空。
3、如何创建一个后台进程?
创建一个后台进程步骤:
1.调用fork产生一个子进程,使父进程退出。
2.调用stesid创建一个新对话期。
3.禁止进程重新打开控制终端。通过fork在创建一个新的子进程,退出父进程,保证该进程不是进程组长。
4.关闭不再需要的文件描述符。关闭0到最高文件描述符值的所有文件描述符。for(i=0; i
#include<stdio.h>#include<unistd.h>#include<sys/types.h>#include<signal.h>#include<sys/param.h>#include<sys/stat.h>#include<time.h>#include<syslog.h>int init_daemon(void){ int pid; int i; /*忽略终端I/O信号,stop信号*/ signal(SIGTTOU,SIG_IGN); signal(SIGTTIN,SIG_IGN); signal(SIGTSTP,SIG_IGN); signal(SIGHUP,SIG_IGN); pid=fork(); if(pid>0) exit(0);/*结束父进程,使子进程成为后台进程*/ else if(pid<0) return -1; /*建立一个新的进程组,在这个新的进程组中,子进程成为这个进程组的首进程,以使该进程脱离所有终端*/ setsid(); /*通过fork在创建一个新的子进程,退出父进程,保证该进程不是进程组长。*/ pid=fork(); if(pid>0) exit(0); else if(pid<0) return -1; /*关闭所有从父进程继承的不再需要的文件描述符*/ for(i=0;i<NOFILE;close(i++)); /*改变了工作目录*/ chdir("/"); /*将文件屏蔽字设置为0*/ umask(0); /*忽略SIGCHLD信号*/ signal(SIGCHLD,SIG_IGN); return 0;}int main(){ time_t now; init_daemon(); syslog(LOG_USER|LOG_INFO," test daemon!\n"); while(1) { sleep(8); time(now); syslog(LOG_USER|LOG_INFO,"system time: \t%s\t\t\n",ctime(&now)); }}
4.fork函数和vfork函数创建进程有什么区别?
*两者都是调用一次,返回两次。
*用fork函数创建一个子进程时,子进程只是完全复制父进程的资源。这样得到的子进程完全独立与父进程,具有良好的并发性,而使用vfork创建一个子进程时,操作系统不讲父进程的地址空间我那全复制到子进程,子进程共享父进程的地址空间,子进程完全运行在父进程的地址空间上。子进程对该地址的任何数据修改同样为父进程所见。
*使用fork创建一个子进程时,哪一个进程先运行取决于系统的调度算法,而vfork一个进程时,vfork保证子进程先运行,当它调用exec或exit之后,父进程才可能被调度运行,如过在调用exec或exit之前子进程要依赖父进程的某个行为,会导致死锁。
- Linux C 编程 第七章习题
- C++Primer习题第七章
- Linux C编程一站式学习第七章
- python核心编程第七章习题
- <python 核心编程第七章习题补充>
- C primer plus第七章习题
- C++primer第七章习题答案
- Linux C 编程一站式学习笔记——第七章
- python核心编程第七章习题解答(1)
- python核心编程第七章习题答案(2)
- python核心编程第七章习题答案(3)
- Python核心编程第七章笔记及习题记录
- unix环境高级编程第七章习题的一些拙见
- UNIX环境高级编程习题——第七章
- 《python核心编程第二版第七章习题补充》
- 第七章习题汇总
- 第七章习题
- C程序设计(第二版)第七章习题
- 数据结构实验之查找五:平方之哈希表(详解平方法解决哈希表冲突)
- 如何将换行符、特殊字符从html传到php,how to capture newline from input
- DataFrame转化成RDD-[2]schema法
- 51nod 1076 2条不相交的路径【边双连通+染色】
- Windows7下如何设置MyEclipse2014字体大小
- Linux C 编程 第七章习题
- 和为s的两个数字
- ubuntu server xfce 配置(亲测)
- 页面一直刷新的问题
- 【codevs】1359求一个整数有几位
- SqlSession的使用范围---Mybatis学习笔记(五)
- titanx pascal显卡工作站安装ubuntu系统及深度学习环境(解决了显示器HDMI超出频率的黑屏问题)
- tkinter学习总结-初学者
- 华丽丽的分割线