unix系统
pk_20140716
缘起于BIOS,发展于内核,直至进程启动,电脑的世界开启了!
展开
-
unix系统之与文件系统相关的系统调用
自unix诞生之初,文件系统便成为了unix系统的一部分。尽管那时的文件系统只能支持512K字节的磁盘且每个文件限定长度为64K字节。但是文件系统的基础结构已经基本确定。构建在文件系统之上的相关的系统调用也已基本成型。后来发展的与文件系统相关的系统调用也是在其基础之上不断完善而来的。unix中与文件系统相关的系统调用大约有50多条。按照它们功能的不同可以将它们分为三类:创建与删除,获取与修改以及其他原创 2017-02-20 17:49:51 · 874 阅读 · 0 评论 -
glibc源码分析之statfs系列函数
glibc中与statfs函数相关的函数有4个,它们分别是:statfs,fstatfs,statfs64,fstatfs64。它们都是系统调用的封装函数。 关于statfs的系统调用有statfs(99),fstatfs(100),statfs64(268),fstatfs64(269)。statfs,fstatfs用于获取文件系统属性,属性是32位的。statfs64,fstatfs64用于获原创 2017-08-18 18:54:07 · 2057 阅读 · 0 评论 -
glibc源码分析之普通文件读写
glibc中关于普通文件读写的函数有open,close,read,write,lseek,lseek64。它们分别封装了open,close,read,write,lseek,_llseek系统调用。 lseek用于在32位长度的文件中跳转,_llseek用于在64位长度的文件中跳转。 open函数的封装在前文中已经介绍了。close函数定义在sysdeps/unix/sysv/linux/c原创 2017-08-18 19:23:03 · 2209 阅读 · 0 评论 -
glibc源码分析之系统调用(一)
在编写本文时,glibc的最新版本是glibc-2.26。本文所有描述都是基于glibc-2.26。 系统调用 系统调用是程序员接触到的最底层的构建程序的组件。它们由内核实现,提供给程序调用。用户按照其调用规则可以实现调用。 glibc的封装方式 glibc使用了两种方式来封装系统调用。一种是由脚本生成。一种是.c文件。 使用.c文件封装系统调用,是因为封装过程比较复杂,除了按系统调用的调原创 2017-08-10 20:22:41 · 2759 阅读 · 2 评论 -
glibc源码分析之chdir,fchdir,chroot,getcwd
umask函数用于设置创建文件的掩码。它是由脚本生成的:#define SYSCALL_NAME umask#define SYSCALL_NARGS 1#define SYSCALL_SYMBOL __umask#define SYSCALL_CANCELLABLE 0#define SYSCALL_NOERRNO 1#define SYSCALL_ERRVAL 0#include <原创 2017-08-20 15:33:03 · 851 阅读 · 0 评论 -
glibc源码分析之系统调用(二)
前文已经向大家介绍了用脚本封装系统调用的方法。在本文中,我将向大家介绍使用.c文件封装系统调用的方法。使用.c文件封装系统调用一般出于以下两个原因:一,系统调用已过时,可以使用新的系统调用替换旧的系统调用。系统调用的语义不变。二,封装后的函数改变了系统调用的语义。stat系统调用的封装便是原因一的一个例子。stat系统调用是106号系统调用。使用stat系统调用可以获取文件的属性,但是获取的属性值都原创 2017-08-13 19:29:24 · 917 阅读 · 0 评论 -
glibc源码分析之stat系列函数
glibc中stat系列函数有stat,fstat,lstat。它们都是系统调用的封装函数。 关于stat的系统调用有oldstat(18),oldfstat(28),oldlstat(84),stat(106),lstat(107),fstat(108),stat64(195),lstat64(196),fstat64(197)。oldstat系列系统调用被stat系列系统调用替代了。stat系原创 2017-08-14 19:58:15 · 4126 阅读 · 0 评论 -
glibc源码分析之stat64系列函数
前文介绍了stat系列函数的源码实现,本文将向大家介绍stat64系列函数的源码实现。 stat64系列函数包括stat64,fstat64,lstat64。由于stat系列函数只能获取32位长度的文件的属性,所以glibc又提供了stat64系列函数,用于获取64位长度的文件的属性。 stat64的源码如下:#undef stat64intattribute_hiddenstat64 (原创 2017-08-15 19:11:07 · 3262 阅读 · 1 评论 -
调用stat64系列函数
前文是对stat64系列函数的源码分析。下面将介绍如何在实际情况下调用stat64系列函数。#include <sys/types.h>#include <sys/stat.h>#include <unistd.h>int main(int argc,char **argv){ struct stat64 st64; stat64("/home",&st64);原创 2017-08-15 19:26:43 · 7717 阅读 · 0 评论 -
进程优先级之nice系统调用
unix提供了nice系统调用用于修改当前进程的优先级。long nice(int inc)nice系统调用增加inc到当前进程的nice值。(nice值越大,运行的优先级越低)只有超级用户可以设置inc为负值。如果系统调用执行成功,返回0。如果执行失败,返回-1,错误号放入errno中。原创 2017-08-22 18:48:23 · 840 阅读 · 0 评论 -
glibc源码分析之chmod系列函数
glibc中关于chmod系列的函数有chmod,fchmod。它们都是用于改变文件的属性。 在glibc中chmod和fchmod两个函数都是使用脚本生成的系统调用的封装函数。 它们生成的.S文件内容分别为:#define SYSCALL_NAME chmod#define SYSCALL_NARGS 2#define SYSCALL_SYMBOL __chmod#define SYSC原创 2017-08-15 19:39:09 · 845 阅读 · 0 评论 -
glibc源码分析之truncate系列函数
glibc中关于truncate的函数有4个,它们分别是truncate,ftruncate,truncate64,ftruncate64。 truncate和ftruncate可以截断文件为32位长度,truncate64和ftruncate64可以截断文件为64位长度。truncate函数的源码在sysdeps/unix/sysv/linux/truncate.c文件中。int__trunc原创 2017-08-15 20:07:55 · 855 阅读 · 0 评论 -
进程优先级之setpriority系统调用
unix提供了setpriority系统调用用于设置进程,进程组,用户进程的优先级。long setpriority(int which,int who,int niceval)参数which是PRIO_PROCESS,PRIO_PGRP,PRIO_USER中的一个。#define PRIO_PROCESS 0#define PRIO_PGRP 1#define PRIO_USER原创 2017-08-22 19:55:13 · 5382 阅读 · 0 评论 -
进程优先级之getpriority系统调用
unix提供了getpriority系统调用用于获取当前进程及其他进程的优先级。long getpriority(int which,int who)getpriority系统调用用于返回进程,进程组,用户进程的进程优先级。参数which是PRIO_PROCESS,PRIO_PGRP,PRIO_USER中的一个。#define PRIO_PROCESS 0#define PRIO_PGRP原创 2017-08-22 19:37:47 · 3705 阅读 · 0 评论 -
glibc源码分析之getpriority,setpriority,nice
glibc提供了getpriority,setpriority,nice函数用于获取或者设置进程的优先级。getpriority函数定义在sysdeps/unix/sysv/linux/getpriority.c文件中。#define PZERO 20int__getpriority (enum __priority_which which, id_t who){ int res; res原创 2017-08-23 19:16:41 · 845 阅读 · 0 评论 -
glibc源码分析之用户管理
getuid函数由脚本生成原创 2017-08-23 20:01:13 · 377 阅读 · 0 评论 -
glibc源码分析之rename函数
glibc提供了rename系统调用用于修改文件路径。rename函数定义在sysdeps/unix/sysv/linux/rename.c文件中。intrename (const char *old, const char *new){ return INLINE_SYSCALL_CALL (rename, old, new);}rename 函数调用了rename系统调用。原创 2017-08-18 18:32:20 · 887 阅读 · 0 评论 -
glibc源码分析之文件的创建与删除
glibc中与文件创建与删除有关的函数有creat,unlink,原创 2017-08-16 19:53:46 · 780 阅读 · 0 评论 -
unix系统之进程初始化
main函数之前熟悉c语言的人都应该了解一条规则——程序从main函数开始执行。但main函数的指令真的是第一条执行的指令吗?其实不然。在main函数执行之前,程序执行了一段初始化代码。初始化代码初始化进程环境,然后调用main函数。到这里main函数才开始执行。初始化代码的第一条指令才是程序第一条执行的指令。那么初始化代码到底做了什么?本文将详细讨论此问题。进程环境要了解初始化代码做了什么,需要先原创 2017-03-18 17:43:09 · 499 阅读 · 0 评论 -
unix系统之系统调用
系统调用(system call)是操作系统提供给程序调用的接口,程序调用系统调用完成所需的系统任务。 系统调用类似于我们平常使用的工具包。当你需要钳子时,你就从工具包中拿出钳子使用。当你需要老虎钳时,你就从工具包中拿出老虎钳使用。当你需要螺丝刀,你就从工具包中拿出螺丝刀使用……系统调用也是同样的原理,当你需要获取当前时间时,你可以调用获取当前时间的系统调用。当你需要创建文件时,你可以调用创建文件原创 2017-03-05 19:01:54 · 1532 阅读 · 0 评论 -
unix系统之系统调用的封装
系统调用每个程序在运行时都可以调用一系列的特殊“函数”。这些特殊的“函数”能够完成各种不同的系统任务——获取当前时间,打开读写文件等。这些特殊的函数有一个特殊的名字——系统调用。调用系统调用系统调用不同于普通函数,调用过程十分特殊。(以下讨论基于linux系统)其调用过程是:一 设置系统调用号。每个系统调用都有一个独特的系统调用号。通过系统调用号可以在几百个系统调用中确定系统调用。设置系统调用号要原创 2017-03-13 20:20:56 · 424 阅读 · 0 评论 -
unix系统之库函数
内核在执行每个程序时都会为其提供4G的内存空间(32位系统下)。4G内存空间中0-3G属于用户内存空间,3G以上属于内核内存空间。如图一。内核内存空间保存着内核的代码与数据。其中包括了系统调用对应的内核函数。这些函数使用户可以执行各种系统调用——内核内存空间为用户提供了系统调用。那么用户内存空间又为用户提供了什么呢? 用户内存空间为用户提供了各种不同的库函数。 0-3G的用户内存空间犹如一张白纸原创 2017-03-13 20:59:12 · 444 阅读 · 0 评论 -
glibc源码分析之进程启动(start.S)
启动代码顾名思义,启动代码就是使进程启动的代码。它包含了进程运行的第一条指令。 每个程序都有一段启动代码。启动代码初始化进程环境,调用main函数,使程序正式开始运行。 glibc为我们提供了进程的启动代码,本文将详细讲解glibc提供的启动代码。(基于glibc2.7)启动代码的实现接下来,我们将详细讲解启动代码的实现。 让我们来看一下glibc源代码中启动代码的实现。 glibc的启动代原创 2017-04-16 18:49:39 · 1597 阅读 · 0 评论 -
进程探寻之内存分布
UNIX系统中进程都会占用4G虚拟内存。4G虚拟内存又被分成不同的内存区域,用于完成不同的程序功能。本文将详细介绍进程中不同区域的功能,既内存分布情况。 用户空间与内核空间 4G虚拟内存可分为两大部分——用户空间与内核空间。用户空间占用3G内存空间,是0x00000000到0xbfffffff的内存区域。内核空间占用1G内存空间,是0xc0000000到0xffffffff的内存区域。内核空间保原创 2017-04-30 15:54:43 · 255 阅读 · 0 评论 -
unix系统之库函数(二)
分类 开发者为我们提供了大量的库函数。这些库函数可以分成许多类型,方便使用。面向对象的加入原创 2017-03-24 20:28:06 · 328 阅读 · 0 评论 -
unix系统之getpid()
unix系统中程序都是以进程的方式运行的。每个进程都有一个标识符用于标识进程。通过进程标识符,我们可以向进程发送信号。unix系统提供了2个系统调用用于获取进程的标识符和父进程的标识符。#include <sys/types.h>#include <unistd.h>pid_t getpid(void);pid_t getppid(void);getpid()返回调用进程的进程ID。它经常被用原创 2017-04-10 19:24:28 · 1020 阅读 · 0 评论 -
unix系统之acct()
unix系统提供了进程记账功能,在进程结束时将进程相关信息写入文件。#include <unistd.h>int acct(const char * file, int mode);acct系统调用用于开启或者关闭进程记账功能。如果以一个存在的文件的文件名作为参数,进程记账功能将开启。在进程结束时将进程相关信息添加到文件中。如果以NULL作为参数,进程记账功能将被关闭。如果执行成功则返回0,如果失原创 2017-04-15 20:27:34 · 1006 阅读 · 0 评论 -
/proc文件内容详解
/proc/uptime /proc/uptime文件用于获取系统运行时间。master@jay-intel:~$ cat /proc/uptime6447032.12 48185264.69第一列输出的是,系统启动到现在的时间(以秒为单位); 第二列输出的是,系统空闲的时间(以秒为单位)。/proc/meminfo /proc/meminfo文件用于获取内存信息。可获取内存总容量,可用内存原创 2017-07-06 18:51:01 · 1344 阅读 · 0 评论 -
进程信息之times系统调用
unix提供了times系统调用用于获取进程及其子进程的运行时间。clock_t sys_times(struct tms* tbuf);struct tms { clock_t tms_utime; clock_t tms_stime; clock_t tms_cutime; clock_t tms_cstime;};(32位系统下clock_t为long类型)t原创 2017-08-08 19:29:32 · 723 阅读 · 0 评论 -
进程信息之getrusage系统调用
unix提供了getrusage系统调用获取进程的资源信息。long getrusage(int who, struct rusage *ru);struct rusage { struct timeval ru_utime; /* user time used 用户态下程序运行时间*/ struct timeval ru_stime; /* system time原创 2017-08-08 19:56:38 · 682 阅读 · 0 评论 -
glibc源码分析之chown系列函数
glibc中关于chown的函数有3个,它们分别是chown,fchown,lchown。它们都是系统调用的封装函数。 关于chown的系统调用有6个,它们分别是lchown(16),fchown(95),chown(182),lchown32(198),fchown32(207),chown32(212)。它们都是用于改变文件的用户ID和组用户ID。chown系列系统调用只能将用户ID和组用户I原创 2017-08-16 18:49:46 · 676 阅读 · 0 评论 -
glibc源码分析之utime系列函数
glibc中关于utime的函数有utime,utimes。它们都是系统调用的封装函数。 utime函数由脚本生成。生成的.S文件的内容为:#define SYSCALL_NAME utime#define SYSCALL_NARGS 2#define SYSCALL_SYMBOL utime#define SYSCALL_CANCELLABLE 0#define SYSCALL_NOER原创 2017-08-16 19:00:47 · 367 阅读 · 0 评论 -
glibc源码分析之access函数
access函数用于检查文件的权限。它封装了access系统调用。 access源码定义在sysdeps/unix/sysv/linux/access.c文件中。int__access (const char *file, int type){ return INLINE_SYSCALL_CALL (access, file, type);}weak_alias (__access,原创 2017-08-16 19:09:26 · 992 阅读 · 0 评论 -
linux系统调用列表
进程进程标识符 系统调用名 系统调用功能 getpid 获取进程标识符 getppid 获取父进程标识符进程优先级 系统调用名 系统调用功能 nice 设置当前进程优先级 getpriority 获取进程优先级 setpriority 设置进程优先级原创 2017-08-22 18:28:21 · 314 阅读 · 0 评论