系统调用

exit(0)与exit(1)、return

别说谁变了你拦得住时间么 提交于 2020-04-07 08:21:12
exit(0):正常运行程序并退出程序; exit(1):非正常运行导致退出程序; return():返回函数,若在主函数中,则会退出函数并返回一值。 详细说: 1. return返回函数值,是关键字; exit 是一个函数。 2. return是语言级别的,它表示了调用堆栈的返回;而exit是系统调用级别的,它表示了一个进程的结束。 3. return是函数的退出(返回);exit是进程的退出。 4. return是C语言提供的,exit是操作系统提供的(或者函数库中给出的)。exit是一个库函数,exit(1)表示发生错误后退出程序,exit(0)表示正常退出。在stdlib.h中exit函数是这样子定义的:void exit(int status)。这个系统调用是用来终止一个进程的,无论在程序中的什么位置,只要执行exit,进程就会从终止进程的运行。讲到exit这个系统调用,就要提及另外一个系统调用,_exit,_exit()函数位于unistd.h中,相比于exit(),_exit()函数的功能最为简单,直接终止进程的运行,释放其所使用的内存空间,并销毁在内存中的数据结构,而exit()在于在进程退出之前要检查文件的状态,将文件缓冲区中的内容写回文件。 5. return用于结束一个函数的执行,将函数的执行信息传出给其他调用函数使用;exit函数是退出应用程序

鸟哥的私房菜 第0章

南笙酒味 提交于 2020-04-06 07:56:38
(1)计算机硬件的五大单元:输入单元、输出单元、CPU内部的控制单元、算术逻辑单元和内存五大部分。 (2)CPU的种类:CPU的种类有两种,根据指令的执行时间和操作的复杂度分为精简指令集合复杂指令集。 (3)一般的,文件大小使用的是二进制的方式,所以1GB的文件大小实际上为:1024*1024*1024B那么大。速度单位则常使用十进制,例如1GHZ就是1000*1000*1000Hz的意思。(一般硬盘制造商会使用十进制的单位) (4)主板上的芯片组通常又分为两个桥接器来控制各组件的通信:(一)北桥负责连接速度较快的CPU、内存和显卡等组件;(二)南桥负责连接速度较慢的周边接口,包括硬盘、USB、网卡等。(AMD和Intel不同的地方是将内存控制组件集成到CPU中,不用经过北桥,理论上能加速CPU与内存的传输速度) (5)多核就是在CPU封装中嵌入多个运算内核(一个CPU外壳中有多个CPU单元), 频率就是CPU每秒钟可以进行的工作次数。 (6)外频就是CPU与外部组件进行数据传输/运算的速度,倍频则是CPU内部用来加速工作性能的一个倍数,两者相乘才是CPU的频率。(一般超频都是超倍频,不过要注意CPU的极限) (7)CPU与内存的通行靠的是外部频率(也就是倍频),也就是总线。现在常见的总线宽度有32/64位,如果架构中前端总线最高速度为1600MHz,则频宽为:1600MHz

高级必问:Linux 中的零拷贝技术是什么?

南笙酒味 提交于 2020-04-05 22:57:05
作者:卡巴拉的树 https://www.jianshu.com/p/fad3339e3448 正文 本文探讨Linux中 主要的几种零拷贝技术 以及零拷贝技术 适用的场景 。为了迅速建立起零拷贝的概念,我们拿一个常用的场景进行引入: 01 引文 在写一个服务端程序时(Web Server或者文件服务器),文件下载是一个基本功能。这时候服务端的任务是:将服务端主机磁盘中的文件不做修改地从已连接的socket发出去,我们通常用下面的代码完成: while((n = read(diskfd, buf, BUF_SIZE)) > 0) write(sockfd, buf , n); 基本操作就是循环的从磁盘读入文件内容到缓冲区,再将缓冲区的内容发送到socket。但是由于Linux的I/O操作默认是缓冲I/O。这里面主要使用的也就是read和write两个系统调用,我们并不知道操作系统在其中做了什么。实际上在以上I/O操作中,发生了多次的数据拷贝。 当应用程序访问某块数据时,操作系统首先会检查,是不是最近访问过此文件,文件内容是否缓存在内核缓冲区,如果是,操作系统则直接根据read系统调用提供的buf地址,将内核缓冲区的内容拷贝到buf所指定的用户空间缓冲区中去。如果不是,操作系统则首先将磁盘上的数据拷贝的内核缓冲区,这一步目前主要依靠DMA来传输

《操作系统概论》第一章引论读书笔记

冷暖自知 提交于 2020-04-05 22:20:51
计算机系统分为硬件和软件。 硬件主要由:CPU、存储器、输入输出控制系统、各种输入输出设备组成。 软件主要分为:系统软件、支撑软件、以及应用软件。 操作系统定义:一般认为,操作系统是管理计算机系统资源、控制程序执行、改善人机界面和为应用软件提供支持的一种系统软件。 操作系统的作用: 管理计算机系统的资源。 为用户提供方便的使用接口。 具有扩充硬件的功能。 操作系统的功能: 从资源管理的观点看, 操作系统的功能可以分为:处理器管理、存储管理、文件管理和设备管理。 处理器管理的主要工作是进行处理器的分配调度。 存储管理是对主存储器进行管理。 文件管理面向用户实现按名存取,支持对文件的存储、检索以及解决文件的共享、保护和保密等问题。 设备管理负责管理各类外围设备,包括分配、启动和故障处理等。 三种基本类型的操作系统:批处理操作系统、分时操作系统、实时操作系统。 操作系统的发展: 微机操作系统、网络操作系统、分布式操作系统、嵌入式操作系统、当前流行的操作系统(windows\unix\linux)。 早期的微型计算机上运行的操作系统每次只允许一个用户使用计算机,被称为单用户微机操作系统,如CP/M,MS-DOS等。 把为计算机网络配置的操作系统称为网络操作系统。 为分布式计算机系统配置的操作系统称为分布式操作系统。主要特点:统一性、透明性。 计算机硬件不再以物理上独立的装置形式出现

Linux Namespace 入门系列:Namespace API

半城伤御伤魂 提交于 2020-04-05 17:23:29
Linux Namespace 是 Linux 提供的一种内核级别环境隔离的方法。用官方的话来说,Linux Namespace 将全局系统资源封装在一个抽象中,从而使 namespace 内的进程认为自己具有独立的资源实例。这项技术本来没有掀起多大的波澜,是容器技术的崛起让他重新引起了大家的注意。 Linux Namespace 有如下 6 个种类: 分类 系统调用参数 相关内核版本 Mount namespaces CLONE_NEWNS Linux 2.4.19 UTS namespaces CLONE_NEWUTS Linux 2.6.19 IPC namespaces CLONE_NEWIPC Linux 2.6.19 PID namespaces CLONE_NEWPID Linux 2.6.24 Network namespaces CLONE_NEWNET 始于Linux 2.6.24 完成于 Linux 2.6.29 User namespaces CLONE_NEWUSER 始于 Linux 2.6.23 完成于 Linux 3.8 namespace 的 API 由三个系统调用和一系列 /proc 文件组成,本文将会详细介绍这些系统调用和 /proc 文件。为了指定要操作的 namespace 类型,需要在系统调用的 flag 中通过常量 CLONE_NEW*

linux中wait系统调用

人走茶凉 提交于 2020-04-03 16:52:39
系统中的 僵尸进程 都要由wait系统调用来回收,下面就通过实战看一看wait的具体用法: wait的函数原型是: #include <sys/types.h> /* 提供类型pid_t的定义 */ #include <sys/wait.h> pid_t wait(int *status); 返回值: 如果执行成功则返回子进程识别码(PID),如果有错误发生则返回-1。失败原因存于errno中。 进程一旦调用了wait,就立即 阻塞自己 ,由wait 自动分析 是否当前进程的某个子进程已经 退出,如果让它找到了这样一个已经变成僵尸的子进程, wait就会收集这个子进程的信息,并把它彻底销毁后返回 ;如果没有找到这样一个子进程,wait就会一直阻塞在这里,直到有一个出现为止。 参数status用来保存被收集进程退出时的一些状态,它是一个指向int类型的指针。但如果我们对这个子进程是如何死掉的毫不在意,只想把这个僵尸进程消灭掉,(事实上绝大多数情况下,我们都会这样想),我们就可以设定这个参数为NULL,就象下面这样: pid = wait(NULL); 如果成功,wait会返回被收集的子进程的进程ID, 如果调用进程没有子进程,调用就会失败,此时wait返回-1,同时errno被置为ECHILD。 下面就让我们用一个例子来实战应用一下wait调用: /* wait1.c */

编译内核及系统调用实验

天大地大妈咪最大 提交于 2020-03-31 14:15:25
电脑出现各种问题,在装虚拟机时也出现了各种问题,给的实验指导书也有各种问题。周四折腾一下午+晚上、周五一天、周六一天,遇到的各种问题都搞定了,实验成功了,现在贴出我的操作步骤,感觉这将会是我的最干的博客之一。 先贴出结果吧 准备工作: 我的电脑只有120G,之前一直做了个Ubuntu的启动盘用,这次没预料到实验对硬盘空间需求如此之大,只得重装虚拟机。在移动硬盘上开辟空间50G(建议不要装好系统后再扩展容量,时间耗费巨大而且ubuntu自带软件中没有硬盘分区软件,安装硬盘分区软件还需要很多依赖,烦不胜烦),在VMware Workstation上使用高级模式创建虚拟机,CPU和内存配置为2x2,4G。在创建完成ubuntu虚拟机后不要立即运行!!!因为VMtools在创建好了以后会自动加载到你刚指定的虚拟机文件夹中,在开启ubuntu虚拟机后它会和系统引导一起启动,导致系统卡死在“install vm-tools"这一行,解决的方法就是在虚拟机文件夹中找到autoinst.iso这个文件并删除(这会导致系统不能自动安装并且在装好系统后不能使用vmtools这个工具,如果想使用vmtools这个工具只能在系统安装完成后再安装,后面讲)。删除上述文件后可以启动系统安装了,,,,,,,,,,,,,安装完成后选择 设置中选择VM Workstation安装文件夹,在其中选择”linux

内核编译与系统调用

℡╲_俬逩灬. 提交于 2020-03-31 14:12:55
内核编译与系统调用 内核编译与系统调用实验,终于在自己虚拟机上编译成功了。 若再次编译内核,并在prink函数打印时提高打印级别,即可使其打印到屏幕 来源: https://www.cnblogs.com/destiny-love/p/12068742.html

内核编译与系统调用

…衆ロ難τιáo~ 提交于 2020-03-31 14:07:37
Linux内核编译 一、 前期准备 1.下载内核源码: 先确定自己双系统或者虚拟机中linux的内核版本是多少,用uname –r命令可以查看。 确定内核版本后可以去内核官网www.kernel.org看发布的稳定内核版本,一般不选最新版本,可能存在不兼容问题,所以我下载了接近的版本3.14.40版本。(linux-3.14.40.tar.xz)。 将压缩包复制到/usr/src/文件下,使用sudo cp 下载路径\linux-3.14.40.tar.xz /usr/src命令。 将其解压缩,使用sudo tar –xvf 3.14.40.tar.xz命令解压缩到当前文件夹下。 (基本上关于编写系统函数或编译内核都需要root权限,可以切换到root用户,也可以用sudo命令,我实验时候用sudo) 2.确认自己系统的位数: 可以使用命令查看当前位数(getconf LONG_BIT); 或者如果是图形界面直接点击右上角,有“关于这台计算机的”的选项,显示操作系统的信息。 3.确认自己虚拟机硬盘空间足够大: 一般推荐40G吧,可以使用df –h命令查看当前系统还剩多少可用空间,最好保留20G大小的空间,实际上我编译完内核后估计就用了10G左右。 如果空间不够,在关闭虚拟机上面,在设置里面点击进入硬盘操作界面,使用实用工具里的扩展。 4.线程数(可选): 为了追求编译内核速度

Linux内核学习第五周 系统调用

╄→尐↘猪︶ㄣ 提交于 2020-03-31 13:56:33
一、实验截图 二、系统调用流程图: 三、总结:系统调用过程分析 linux 的系统调用过程:用户程序 →C 库(即 API ): INT 0x80 →system_call→系统调用服务例程→内核程序。我们常说的用户 API 其实就是系统提供的 C 库。 系统调用是通过软中断指令 INT 0x80 实现的,而这条 INT 0x80 指令就被封装在 C 库的函数中。软中断和我们常说的硬中断不同之处在于,软中断是由指令触发的,而不是由硬件外设引起的。 INT 0x80 这条指令的执行会让系统跳转到一个预设的内核空间地址,它指向系统调用处理程序,即 system_call 函数。系统调用处理程序 system_call 并不是系统调用服务例程,系统调用服务例程是对一个具体的系统调用的内核实现函数,而系统调用处理程序是在执行系统调用服务例程之前的一个引导过程,是针对 INT 0x80 这条指令,面向所有的系统调用的。简单来讲,执行任何系统调用,都是先通过调用 C 库中的函数,这个函数里面就会有软中断 INT 0x80 语句,然后转到执行系统调用处理程序 system_call , system_call 再根据具体的系统调用号转到执行具体的系统调用服务例程。 system_call 函数是怎么找到具体的系统调用服务例程的呢?通过系统调用号查找系统调用表 sys_call_table