Linux系统调用
pk_20140716
缘起于BIOS,发展于内核,直至进程启动,电脑的世界开启了!
展开
-
uname(系统调用)
uname系统调用可用于获取操作系统名字,操作系统的发行级别号,类似于”2.6.28”,操作系统版本号,机器的类型,例如x86或arm。struct utsname { char sysname[]; /* Operating system name (e.g., "Linux") 操作系统的名字*/ char nodename[]; /* Name within "so原创 2015-11-21 14:00:04 · 2055 阅读 · 1 评论 -
readdir(系统调用)
#include <stdio.h>#include <fcntl.h>#include <linux/types.h>#include <linux/dirent.h>#include <linux/unistd.h>int errno;_syscall3(int,readdir,uint,fd,struct dirent *,dirp,uint,count);int main(int a原创 2015-07-13 20:13:46 · 1945 阅读 · 0 评论 -
操作系统 - unix和windows下进程异同
在UNIX系统中,只有一个系统调用可以用来创建新进程:fork。这个系统调用会创建一个与调用进程相同的副本。在调用了fork之后,这两个进程(父进程和子进程)拥有相同的存储映像、同样的环境字符串和同样的打开文件。这就是全部情形。同城,子进程接着执行execve或一个类似的系统调用,以修改其存储映像并运行一个新的程序。例如,当一个用户在shell中键入命令时,shell就创建一个子进程,然后,这个子转载 2015-11-06 19:36:54 · 335 阅读 · 0 评论 -
sysinfo函数使用方法
Linux中,可以用sysinfo来获取系统相关信息。 正文 Linux中,sysinfo是用来获取系统相关信息的结构体。 函数声明和原型:#include int sysinfo(struct sysinfo *info);结构体信息: 在Linux 2.3.16中,结构体的信息是(单位是字节):struct sysinfo { long uptim转载 2015-06-28 16:22:14 · 1687 阅读 · 0 评论 -
uname
主机信息 正如我们可以确定用户信息一样,程序也可以确定其运行的计算机的信息。uname命令提供了这些信息。uname同时也作为一个系统调用来在一个C程序中提供同样的信息,我们可以使用man 2 uname来查看详细的信息。许 多情况都需要主机信息。我们也许希望依据在网络中一个程序所运行的机器的名字来自定义其行为,也就是说,是一个学生的机器还是一个管理员的机器。为了授权 的目的,我们也许希望限制一个程转载 2015-07-17 19:52:12 · 600 阅读 · 0 评论 -
linux下常用的几个时间函数:time,gettimeofday,clock_gettime,_ftime
time()提供了秒级的精确度 1、头文件 2、函数原型 time_t time(time_t * timer) 函数返回从TC1970-1-1 0:0:0开始到现在的秒数 用time()函数结合其他函数(如:localtime、gmtime、asctime、ctime)可以获得当前系统时间或是标准时间。 #include #include int main(vo转载 2016-01-31 16:44:51 · 1235 阅读 · 0 评论 -
用brk实现sbrk,关于brk的返回值
首先我们已经知道linux下,malloc最后调用的是sbrk函数,而sbrk是对brk的简单封装。 用sbrk模仿malloc很简单,sbrk(0)得到当前breakpoint,再调用sbrk(size)即可。(PS:breakpoint表示堆结束地址) 一直以来让我困惑的是,怎么用brk去实现sbrk,换句话说,就是只有brk系统调用,如何能得知当前的breakpo转载 2015-11-09 12:08:04 · 2043 阅读 · 1 评论 -
获取设置时间系统调用
名字 用处 time_t time(time_t *t) 获取系统时间,获取的为秒数 int stime(time_t *t) 设置系统时间,设置的为秒数 int gettimeofday(struct timeval *tv,struct timezone *tz) 设置系统时间,可获取秒数与微秒数 int settimeofday(struct timeval *t原创 2015-07-21 19:58:18 · 932 阅读 · 0 评论 -
setgroups函数:设置组代码函数
函数说明:setgroups()用来将list 数组中所标明的组加入到目前进程的组设置中. 参数size 为list()的gid_t 数目, 最大值为NGROUP(32)。#include <grp.h>int setgroups(size_t size, const gid_t * list);返回值:设置成功则返回0, 如有错误则返回-1.错误代码: EFAULT:参数list 数组地址不合转载 2015-07-16 20:50:16 · 3871 阅读 · 0 评论 -
getgroups()函数:获取组代码函数
函数说明:getgroup() 用来取得目前用户所属的组代码. 参数size 为list() 所能容纳的gid_t 数目. 如果参数size 值为零, 此函数仅会返回用户所属的组数。#include <unistd.h> #include <sys/types.h>int getgroups(int size, gid_t list[]);返回值:返回组识别码, 如有错误则返回-1.错误代码转载 2015-07-16 20:45:58 · 3479 阅读 · 0 评论 -
linux—select详解
linux—select详解 select系统调用时用来让我们的程序监视多个文件句柄的状态变化的。程序会停在select这里等待,直到被监视的文件句柄有一个或多个发生了状态改变。关于文件句柄,其实就是一个整数,通过socket函数的声明就明白了:int socket(int domain, int type, int protocol);我们最熟悉的句柄是0、1、2三个,0是标转载 2015-06-06 10:57:12 · 319 阅读 · 0 评论 -
Linux读取目录函数readdir以及inode结构简介
readdir 语法: struct dirent* readdir(DIR* dir_handle); 返回值: dirent结构 函数种类: 文件存取 内容说明 本函数用来读取目录。返回目录中的文件名称,读取不依照inode,依据的是dirent结构中的d_off inodein转载 2015-07-13 20:15:31 · 1156 阅读 · 0 评论 -
setuid seteuid setreuid 三个函数讲解
int setuid(uid_t uid) 1) 若进程具有超级用户权限,则setuid将实际用户ID、有效用户ID及保存的设置用户ID设置为uid 2) 若进程没有超级用户权限,但是uid等于实际用户ID或保存的设置用户ID,则setuid只将有效用户ID设置为uidint seteuid(uid_t uid) 1) 若进程具有超级用户权限,则setuid转载 2015-07-18 11:45:47 · 2802 阅读 · 1 评论 -
Linux系统时间写入CMOS时钟
我们一般使用“date -s”命令来修改系统时间。比如将系统时间设定成2005年7月26日的命令如下。 #date -s 07/26/2005 将系统时间设定成下午11点12分0秒的命令如下。 #date -s 11:12:00 注意,这里说的是系统时间,是linux由操作系统维护的。 在系统启动时,Linux操作系统将时间从CM转载 2015-07-22 19:29:32 · 2116 阅读 · 0 评论 -
adjtimex简介
Adjtimex介绍linux系统有两个时钟:一个是由主板电池驱动的“Real Time Clock”也叫做RTC或者叫CMOS时钟,硬件时钟。当操作系统关机的时候,用这个来记录时间,但是对于运行的系统是不用这个时间的。另一个时间是 “System clock”也叫内核时钟或者软件时钟,是由软件根据时间中断来进行计数的,内核时钟在系统关机的情况下是不存在的,所以,当操作系统启动的时候,内核时钟是要读转载 2015-07-22 19:32:12 · 1301 阅读 · 0 评论 -
sysinfo(系统调用)
sysinfo系统调用可以返回系统相关系统,比如总内存大小,未使用内存大小,共享存储器大小……#include <sys/sysinfo.h>int sysinfo(struct sysinfo *info);结构体信息:一直到Linux 2.3.16,结构体的信息是(单位是字节):struct sysinfo { long uptime; /* 启动到原创 2015-11-22 16:09:34 · 1822 阅读 · 0 评论 -
7种文件类型的创建与删除(系统调用)
UNIX下存在7种文件类型,分别是普通文件,目录文件,软连接文件,字符设备文件,块设备文件,管道文件,套接字文件。 每种文件类型都可以在目录下创建。以下为这些文件创建,删除所使用的系统调用。 1.普通文件。这是使用最多的文件类型。 创建int open(const char *pathname, int flags, mode_t mode);//flag使用O_CREAT时int creat原创 2015-11-24 18:49:49 · 949 阅读 · 0 评论 -
7种文件类型属性的获取与修改(系统调用)
UNIX下7种文件类型创建后都存在对其修改的系统调用,修改涉及对名字的修改,对属性的修改,以及对内容的修改。原创 2015-11-24 19:00:16 · 852 阅读 · 0 评论 -
关于系统调用(一)
1. 什么是系统调用?系统调用也叫做操作系统接口,是操作系统提供给应用程序的一组接口。应用程序执行特权指令切入内核,执行操作系统内核中的代码。本质 本质上系统调用是一个函数列表,执行系统调用就像调用函数。传入参数,调用,取返回值。不过该函数列表存在于内核空间,用户能调用,却并不知道调用过程发生了什么。用户调用依赖的是系统调用的功能描述。也就是说,用户只需知道该系统调用能干什么,然后当需要该功原创 2016-02-19 16:38:11 · 569 阅读 · 0 评论 -
系统调用的封装
封装系统调用是一件简单而枯燥的事情封装系统调用的基本过程是: 1. 确认要封装的系统调用,并将系统调用对应的系统调用名称设置为函数的名称。 如系统调用号1对应的系统调用exit封装的函数的名字便是exit。 2. 确认要封装的系统调用的参数及参数类型,并设置为函数的参数。 如exit系统调用的参数为int status,则exit函数参数为int status原创 2016-02-28 11:24:49 · 956 阅读 · 0 评论 -
关于系统调用(二)
怎么用?(实践性) 以x86体系下linux内核为例正如《系统调用一》里所讲,执行系统调用只有3个步骤:选系统调用号,传入系统调用参数,执行特权指令。只要正确的执行这3个步骤便可以完成对所有系统调用的执行。3个步骤简单明了,但实现却纷繁复杂。本文以下内容将以原始,进阶,高阶,三个阶段去了解怎么调用系统调用。三个阶段都能完成系统调用的执行,但抽象程度一个比一个高,实际中的使用程度也一个比一个高。开始原创 2016-02-22 20:22:45 · 368 阅读 · 0 评论 -
Linux 下系统调用的三种方法
系统调用(System Call)是操作系统为在用户态运行的进程与内核进行交互提供的一组接口。当用户进程需要发生系统调用时,CPU 通过软中断切换到内核态开始执行内核系统调用函数。 下面介绍Linux 下三种发生系统调用的方法:通过 glibc 提供的库函数 glibc 是 Linux 下使用的开源的标准 C 库,它是 GNU 发布的 libc 库,即运行时库。glibc 为程序员提供丰富的 A转载 2015-11-09 12:47:27 · 592 阅读 · 0 评论 -
32位linux系统调用
//打开 读 写 跳转 关闭 删除 普通文件 #define __NR_creat 8#define __NR_open 5#define __NR_read 3#define __NR_write 4#define __NR_lseek 19#define __NR__llseek 140#define __NR_close 6#define __NR_unlink 10//创建原创 2015-11-12 19:41:28 · 1474 阅读 · 0 评论 -
Linux系统调用列表
以下是Linux系统调用的一个列表,包含了大部分常用系统调用和由系统调用派生出的的函数。这可能是你在互联网上所能看到的唯一一篇中文注释的Linux系统调用列表,即使是简单的字母序英文列表,能做到这么完全也是很罕见的。按照惯例,这个列表以man pages第2节,即系统调用节为蓝本。按照笔者的理解,对其作了大致的分类,同时也作了一些小小的修改,删去了几个仅供内核使用,不允许用户调用的系统调用转载 2015-07-06 18:58:49 · 402 阅读 · 0 评论 -
clock_settime(系统调用)
clock_settime系统调用可以设置系统时间秒数与纳秒数。 #include <time.h> int clock_settime(clockid_t clk_id, const struct timespec *tp);clockid_t clk_id 用于指定计时时钟的类型,有以下4种: CLOCK_REALTIME:系统实时时间,随系统实时时间改变而改变,即原创 2016-02-05 15:55:23 · 11746 阅读 · 0 评论 -
ftime(系统调用)
ftime系统调用可以获取系统的秒数与毫秒数。但是在linux内核中并未实现该系统调用,所以调用的话,会返回错误码。不过可以使用gettimeofday来获取微秒数,并/1000来算出毫秒数。#include <sys/timeb.h>int ftime(struct timeb *tp);struct timeb{ time_t time; /* 为1970-01-01至今的秒数*/原创 2016-02-05 12:18:10 · 576 阅读 · 1 评论 -
获取/设置时间的系统调用的几个思考
1.为什么存在这么多获取,设置时间的系统调用? 获取/设置时间的系统调用可分为4个类型:秒数,秒数加上毫秒数,秒数加上微秒数,秒数加上纳秒数。 4个类型其实可以只用秒数加上纳秒数就完成。但存在问题: 可以获取纳秒数的设备每台机器不一定存在。 获取纳秒数需要对硬件访问,与获取秒数相比,需要更久的时间 。2.time系统调用为什么返回时间值? time_t time(time原创 2016-02-04 19:26:01 · 621 阅读 · 0 评论 -
settimeofday(系统调用)
settimeofday系统调用可以设置系统的秒数,以及微秒数。需要超级用户权限才能执行。#include <sys/time.h>int settimeofday(const struct timeval *tv, const struct timezone *tz);返回值:出错返回-1,错误码放在errno中,正确返回0.原创 2016-02-04 18:53:51 · 5339 阅读 · 0 评论 -
stime(系统调用)
系统调用stime可以设置系统的时间,不过需要超级用户的权限。#include <time.h>int stime(time_t *t);返回值: 出错返回-1,错误码放在errno中,成功则返回0原创 2016-02-04 18:47:49 · 2551 阅读 · 0 评论 -
time(系统调用)
系统调用 time 可以获取系统时间(秒数)。#include <time.h>time_t time(time_t *t);执行系统调用time,可以获取系统时间,系统时间将写入t指针指向的内存处,并将系统时间作为返回值。原创 2016-02-01 19:03:07 · 1710 阅读 · 0 评论 -
clock_gettime(系统调用)
linux中可以使用clock_gettime系统调用来获取系统时间(秒数与纳秒数)。 纳秒为一秒的十亿分之一。#include <time.h>int clock_gettime(clockid_t clk_id, struct timespec *tp); clockid_t clk_id 用于指定计时时钟的类型,有以下4种: CLOCK_REALTIME:原创 2016-01-31 16:42:48 · 4835 阅读 · 0 评论 -
gettimeofday(系统调用)
linux中可以使用gettimeofday系统调用来获取系统时间(秒数与微秒数)。#include <sys/time.h>int gettimeofday(struct timeval *tv, struct timezone *tz);struct timeval { time_t tv_sec; /* 获取的秒数 */ suseconds_t tv_use原创 2016-01-31 16:11:41 · 1847 阅读 · 0 评论 -
acct(系统调用)
acct系统调用可用于启动/禁止进程信息记录功能。#include <sys/acct.h>int acct(char *filename);成功则返回0,出错返回-1,,错误类型在errno中。在进程记账开启之后,每当系统内有进程终止内核将写一个记录到记账文件。这个记录包含已经终止进程的信息,它定义在头文件 #define ACCT_COMM 16typedef u_int16_t comp_t原创 2016-01-31 12:52:00 · 2139 阅读 · 0 评论 -
Linux的O_DIRECT选项
在man 2 open的时候发现一个O_DIRECT选项,使用O_DIRECT选项后,可以不使用缓存直接写入。在海量数据写入的时候,不使用缓存貌似更快呢!于是也尝试写了一个用O_DIRECT选项的文件写入。完成O_DIRECT选项写入的代码还真不容易,使用new或者malloc分配的内存是无法在O_DIRECT选项下工作的,必须使用posix_memalign(或valloc, memalign,转载 2015-09-03 19:03:49 · 616 阅读 · 0 评论