当前位置: 首页 > news >正文

Linux10 -- 相关习题

1.在家目录下创建以自己的名字命名的目录文件,在这个目录文件底下创建一个普通文件a.txt

(1)查看a.txt的属性信息
(2)用文字设定法给a.txt的其他人加上写权限,给属主加上执行权限。
(3)用数字设定法将a.txt的权限设置为所有者读写执行,同组人读写,其他人读写权限。

2.写出你知道的一些常用的Linux的命令

3.gdb如何使用?常用的调试命令都有哪些?

4.Linux中使用什么命令解压文件?

答:tar

5.g++与 gcc 的区别, g++能编译.c 文件吗? gcc 能编译.cpp 文件吗?

答:

  1. gcc 现在是 GNU 提供的一些编译器工具的集合(Gnu Compiler Collection),以前是
    gnu 组织提供的 c 编译器(Gnu C Compiler)。 g++是 c++编译器编译器。
  2. gcc 可以编译.c 和.cpp 的源文件,对*.c 按 c 语言语法规则处理, *.cpp 自动按 c++
    语法规则处理,但默认不链接相应的 c++库,需要手动指定链接的库名"-lstdc++"
  3. g++可以编译.c 和.cpp 的源文件,但是都按 c++的语法规则来处理。

6.vim的三种模式及常用命令?

  1. 三种模式:命令模式、插入模式、末行模式
  2. 命令模式转插入模式: i a o , I A O
  3. 命令模式下几个快捷操作: nyy 复制 n 行, ndd 删除/剪切 n 行 p 粘贴 等等
  4. 末行模式几种操作: :wq 保持退出 :w 只保存 :q 只退出 :q!不保持退出 等

7.Makefile 文件作用是什么?你能否写出一个简单的makefile文件?

答:管理工程,实现自动化编译。

8.共享库和静态库分别使用什么命令生成?两者的区别是什么?

9.僵死进程概念及处理方式?

子进程先于父进程结束,父进程没有调用 wait 获取子进程的退出码,此时,子进
程变成僵死进程。
解决办法:父进程调用 wait 获取退出码,或 父进程先结束,让 init 进程接管子进
程。

10.Fork 复制过程?

答:1) 分配 pid
2) 分配进程描述符也就是 pcb,同时会分配好内核栈
3) 复制进程实体,即:打开的文件,工作目录、信号信息、进程地址空间,等等
4) 用父进程内核栈上存放的现场信息,初始化为子进程的现场信息,并将 eax 置 0
5) 将父进程时间片分子进程一半,设置进程状态为就绪。

11.Fork 的写时拷贝及作用?

在进行 fork 复制进程时, 并不马上进行父进程的地址空间的完全拷贝。 而是使用
了写时拷贝(Copy-On-Write)技术, 即就是让父进程和子进程共享父进程的页面,当
父进程或子进程中任意一个进程试图修改某个页面时, 再将其拷贝一份给子进程。这样
可以延迟页面拷贝,提高 fork 复制的效率,。另外,通常 Linux 中的新进程都是通过
fork+exec 实现的,如果 fork 后需要执行 exec 那么直接就不需要拷贝了。

12.什么是库函数?什么是系统调用?两者有什么区别?系统调用执行的过程是什么?

答:
首先说一下,用户态和内核态。执行用户代码时,处于用户态,执行内核代码时处于内核态。
库函数的实现在函数库里面,而系统调用的实现在内核中。系统调用执行后会产生中断陷入内核。
系统调用执行过程:
产生 0x80 号中断,保存当前进程现场信息,将该系统调用的系统调用号写入eax 寄存器中。中断处理程序执行,也即切换到了内核态,此处也就是执行系统调用的
程序,从 eax 寄存器中读出系统调用号,查系统调用表,找到对应的内核函数执行,将结果继续写入 eax 寄存器中。中断处理程序执行完成,恢复原程序的执行, 也即回到了用户态。应用程序从 eax 寄存器中读取返回值。

13.main的三个参数分别是什么?

14.printf设置缓冲区的原因是什么?缓冲区刷新到界面(屏幕)上的条件是什么?

printf设计了一个缓冲区,避免多次从用户态切换到内核态,缓冲区满了或者强制刷新,只需要切换一次到内核态打印数据到屏幕上,效率就高一些;
printf将内容先写入到缓冲区中,缓冲区刷新到界面(屏幕)上的条件是:
(1)缓冲区放满
(2)缓冲区未满,强制刷新缓冲区到屏幕(方法一:\n;方法二:主动刷新:fflush(stdout));
(3)程序结束时,自动刷新缓冲区:exit方法;

15.我们在进程中看到的地址是进程的物理地址还是逻辑地址?

答:逻辑地址;

16.(1)申请了一块空间没有free,进程就结束了,那么空间被回收了吗? (2)malloc()申请1G的内存能否成功?判断依据是什么?3G呢?能否申请成功?

(1)如果进程结束了,那么所有向操作系统申请的内存都会被回放(释放);
(2)如果当前的物理内存剩余空间够用,那么申请的空间肯定能成功;
如果物理内存不够,先看有没有虚拟内存,如果有,看虚拟内存加上物理内存能否满足申请的空间大小;

虚拟内存使用:

sudo swapoff -a;关闭虚拟内存;
sudo swapon -a;开启虚拟内存;
在这里插入图片描述

内存使用示例代码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <assert.h>
#include <string.h>

int main()
{
    char *s=(char *)malloc(1024*1024*1024);//申请1G内存
    //char *s=(char *)malloc(1024ll*1024*1024*3);//申请3G内存
    assert(s != NULL);

    memset(s,0,1024ll*1024*1024);
    getchar();//等待输入一个字符,让程序停一下,方便观察
    printf("main over\n");
    exit(0);
}

运行前:

在这里插入图片描述

进程运行时

在这里插入图片描述

进程结束后

在这里插入图片描述

char *s=(char *)malloc(1024ll*1024*1024*3);//申请3G内存

代码运行前:

在这里插入图片描述

运行时,程序阻塞:

在这里插入图片描述

程序结束:

注意:交换空间(旨在内存不够用时,于内存空间进行交换)没有释放回去,为防止
频繁的交换
加粗样式

关闭虚拟内存

sudo swapoff -a;关闭虚拟内存;

关闭前:

在这里插入图片描述

关闭后

在这里插入图片描述

进程运行(申请失败):

在这里插入图片描述

17.父进程堆区申请的空间复制后,子进程也会有一份,是否也需要释放?

答:需要释放;
代码验证:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <assert.h>
#include <string.h>
int main()
{
	char *s=(char *)malloc(128);
	assert(s!=NULL);
	pid_t pid=fork();
	assert(pid=-1);
	if(pid==0)
	{
		strcpy(s,"child");
	}
	else
	{
		strcpy(s,"parent");
	}

	printf("s=%s\n",s);
	free(s);
	exit(0);
}

18.(1)fork 以后,父进程打开的文件指针位置在子进程里面是否一样?(先open再fork)

(2)能否用代码简单的验证一下?
(3)先fork再打开文件父子进程是否共享偏移量?父进程打开的文件指针位置在子进程里面是否一样?能否用代码简单验证一下.(先fork再open会怎么样?)

答:
在 (1)fork 之前打开的文件,在复制进程后,父子进程共享文件偏移量,所以文件指针在相同位置。
(2)代码详见课件
(3)先fork再打开文件,父子进程各自打开各自的,不共享偏移量;代码详见课件;

相关文章:

  • 高匿代理ip/seo优化交流
  • wordpress upload.js/全国最新疫情实时状况地图
  • 台州路桥做网站的公司有哪些/上海seo推广整站
  • 下载网站模板后本地的网站会自动做跳转/搜索引擎排名影响因素有哪些
  • 一个购物交易网站怎么做/互联网推广销售是做什么的
  • 湖南旅游攻略/临沂seo推广外包
  • 公司招人:34岁以上两年一跳的不要,开出工资以为看错了
  • JVM之对象的内存模型、创建过程、对象引用、生命周期
  • docker安装和优化
  • 【机器学习】Ensemble Learning 集成学习 + Python代码实战
  • 巷子里的酒
  • 【C语言案例】——三子棋
  • 云上mysql 简易安装
  • 【手写的从前】解析参考:Numpy手写的多层神经网络
  • Speech recognition模型:RNN Transducer(RNN-T)
  • 【Leetcode】二分法求解问题
  • 22道js输出顺序问题,你能做出几道
  • 30 个 Python 技巧,加速你的数据分析处理速度