linux下获取系统时间的方法

linux下获取系统时间的方法
linux下获取系统时间的方法

linux下获取系统时间的方法

时间:2009-11-11 13:45:04 来源:Linux联盟作者:可以用localtime 函数分别获取年月日时分秒的数值。

Linux下获得系统时间的C语言的实现方法:

1. 可以用localtime 函数分别获取年月日时分秒的数值。

#include //C语言的头文件

#include //C语言的I/O

void main()

{

time_t now; //实例化time_t结构

struct tm *timenow; //实例化tm结构指针

time(&now);

//time函数读取现在的时间(国际标准时间非北京时间),然后传值给now

timenow = localtime(&now);

//localtime函数把从time取得的时间now换算成你电脑中的时间(就是你设置的地区) printf("Local time is %sn",asctime(timenow));

//上句中asctime函数把时间转换成字符,通过printf()函数输出

}

注释:time_t是一个在time.h中定义好的结构体。而tm结构体的原形如下:

struct tm

{

int tm_sec;//seconds 0-61

int tm_min;//minutes 1-59

int tm_hour;//hours 0-23

int tm_mday;//day of the month 1-31

int tm_mon;//months since jan 0-11

int tm_year;//years from 1900

int tm_wday;//days since Sunday, 0-6

int tm_yday;//days since Jan 1, 0-365

int tm_isdst;//Daylight Saving time indicator

};

2. 对某些需要较高精准度的需求,Linux提供了gettimeofday()。

#include

#include

#include

int main(int argc, char **argv)

{

struct tim start,stop,diff;

gettimeofday(&start,0);

//做你要做的事...

gettimeofday(&stop,0);

tim_subtract(&diff,&start,&stop);

printf("总计用时:%d毫秒n",https://www.360docs.net/doc/3c18021423.html,_usec);

}

int tim_subtract(struct tim *result, struct tim *x, struct tim *y) {

int nsec;

if ( x->tv_sec > y->tv_sec )

return -1;

if ((x->tv_sec==y->tv_sec) && (x->tv_usec>y->tv_usec)) return -1;

result->tv_sec = ( y->tv_sec-x->tv_sec );

result->tv_usec = ( y->tv_usec-x->tv_usec );

if (result->tv_usec<0)

{

result->tv_sec--;

result->tv_usec+=1000000;

}

return 0;

}

我们一般使用“date -s”命令来修改系统时间。比如将系统时间设定成2005年7月26日的命令如下。

#date -s 07/26/2005

将系统时间设定成下午11点12分0秒的命令如下。

#date -s 11:12:00

注意,这里说的是系统时间,是linux由操作系统维护的。

在系统启动时,Linux操作系统将时间从CMOS中读到系统时间变量中,以后修改时间通过修改系统时间实现。为了保持系统时间

与CMOS时间的一致性,Linux每隔一段时间会将系统时间写入CMOS。由于该同步是每隔一段时间(大约是11分钟)进行的,在我们执行date -s后,如果马上重起机器,修改时间就有可能没有被写入CMOS,这就是问题的原因。如果要确保修改生效可以执行如下命令。

#clock -w

这个命令强制把系统时间写入CMOS。

史上最全Linux系统命令及使用方法详解(程序员)

Linux 系统命令及其使用详解(大全) (来源: 中国系统分析员) cat cd chmod chown cp cut 名称:cat 使用权限:所有使用者 使用方式:cat [-AbeEnstTuv] [--help] [--version] fileName 说明:把档案串连接后传到基本输出(萤幕或加> fileName 到另一个档案) 参数: -n 或--number 由 1 开始对所有输出的行数编号 -b 或--number-nonblank 和-n 相似,只不过对于空白行不编号 -s 或--squeeze-blank 当遇到有连续两行以上的空白行,就代换为一行的空白行 -v 或--show-nonprinting 范例: cat -n textfile1 > textfile2 把textfile1 的档案内容加上行号后输入textfile2 这个档案里cat -b textfile1 textfile2 >> textfile3 把textfile1 和textfile2 的档案内容加上行号(空白行不加)之后将内容附加到textfile3 名称:cd 使用权限:所有使用者 使用方式:cd [dirName] 说明:变换工作目录至dirName。其中dirName 表示法可为绝对路径或相对路径。若目录名称省略,则变换至使用者的home directory (也就是刚login 时所在的目录).另外,"~" 也表示为home directory 的意思,"." 则是表示目前所在的目录,".." 则表示目前目录位置的上一层目录。 范例:跳到/usr/bin/: cd /usr/bin 跳到自己的home directory: cd ~ 跳到目前目录的上上两层: cd ../.. 指令名称:chmod 使用权限:所有使用者 使用方式:chmod [-cfvR] [--help] [--version] mode file... 说明:Linux/Unix 的档案存取权限分为三级:档案拥有者,群组,其他。利用chmod 可以藉以控制档案如何被他人所存取。 把计: mode:权限设定字串,格式如下:[ugoa...][[+-=][rwxX]...][,...],其中u 表示该档案的拥有者,g 表示与该档案的拥有者属于同一个群体(group)者,o 表示其他以外的人,a 表示这三者

linux系统编程试卷(答案)

凌阳教育 嵌入式培训系统编程部分测试试题 注:考试为闭卷,程序题需上机操作运行出结果,考试时间为120分钟 一:选择题(本题共4小题,每题3分共12分) 1)下列不是Linux系统进程类型的是( D ) A 交互进程 B 批处理进程 C 守护进程 D 就绪进程(进程状态) 2)以下对信号的理解不正确的是( B ) A 信号是一种异步通信方式 B 信号只用在用户空间进程通信,不能和内核空间交互 C 信号是可以被屏蔽的 D 信号是通过软中断实现的 3)进程有三种状态( C ) A 准备态、执行态和退出态 B 精确态、模糊态和随机态 C 运行态、就绪态和等待态 D 手工态、自动态和自由态 4)不是进程和程序的区别( B) A 程序是一组有序的静态指令,进程是一次程序的执行过程 B 程序只能在前台运行,而进程可以在前台或后台运行 C 程序可以长期保存,进程是暂时的 D 程序没有状态,而进程是有状态的 二:填空题(本题共6小题,2)、3)两题每空四分,其余每空一分。共23分) 1) 列举八种常见的进程间通信方式无名管道、有名管道、消息队列、信号量、共享内存、信号、套接字 网络上两个主机的进程间通信方式为套接字 2) 命名管道比无名管道的优势提供了一个可以访问的路径名,实现没亲缘关系的进程 间通信 3) 消息队列比命名管道和无名管道的优势可以按类型实现消息的随机查询,没必要先 进先出 4) 按照逻辑结构不同进行数据库划分,Sqlite 数据库属于哪一类关系型数据库 5) 在C语言中操作sqlite数据库,常用的2中方式是sqlite_exec(回调)、

sqlite_gettable(非回调) 6) 列举四种进程调度算法先来先调度(FCFS)、短进程优先调度(SPF)、高优先级调度 (HPF)、时间片轮转调度 三:问答题(本题共7题,每题5分,共35分) 1) 什么是系统调用?系统调用是通过什么方式陷入内核态的?请写出你对系统调用的理解。什么是文件I/O和标准I/O库?文件I/O和标准I/O库的区别? 系统调用是指操作系统提供给用户程序调用的一组特殊接口,用户程序可以通过这组接口获得操作系统内核提供的服务。 系统调用是通过软件中断方式陷入内核的 linux的文件I/O是由操作系统提供的基本IO服务, 标准I/O库通过封装系统调用,提供了一个到底层I/O的接口。 标准I/O默认采用了缓冲机制,还创建了一个包含文件和缓冲区相关数据的数据结构;文件I/O一般没有采用缓冲模式,需要自己创建缓冲区。一种是标准库封装系统调用而成,更高级,一种是系统提供的,比较低级;标准I/O可移植性高、文件I/O可移植性低。 2) 什么是进程?用fork()创建一个子进程时,系统会做什么工作 进程是具有独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配的单位,不仅是系统内部独立运行的实体也是独立竞争资源的实体。 用fork()时系统会分配子进程一个ID号然后继承父进程的地址空间,包括进程上下文进程堆栈打开的文件描述符等等,他就是父进程的一个复制品。 3) 进程和线程有什么区别? 每个独立的进程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在进程程中,由进程提供多个线程执行的控制。 进程是系统进行资源分配和调度的一个独立单位. 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源. 一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行。 4) 什么是线程的互斥和同步,程序应怎样写才能达到互斥或同步? 互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。 同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源。 在写程序时可以用互斥锁和信号量实现线程同步,一个线程访问共享资源时给这个资源上锁其他线程就不能访问了直到上锁的进程释放互斥锁为止。 5) 什么是僵尸进程?孤儿进程?守护进程? 僵尸进程:僵尸进程是指它的父进程已经退出(父进程没有等待(调用wait/waitpid)它),而该进程dead之后没有进程接受,就成为僵尸进程,也就是(zombie)进程。 孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成

Linux常用命令

(1)基于虚拟机的Linux操作系统的使用 1.启动VMware Workstation应用程序,启动Windows以后,选择开始—程序——VMware—VMware Workstation,出现如图7—1所示窗口。 2.选择File—Open选择安装好的Linux虚拟机文件,或者直接单击Start this virtual machine 启动Linux操作系统。 3.启动系统后需要输入用户名和密码,如图7—2所示,用户名为“root”,密码为“jsjxy308”。 4.启动终端,成功进入系统后,选择“应用程序”—“系统工具”—“终端”。 5.在终端中执行Linux 命令,终端运行以后,就可以在这里输入Linux命令,并按回车键执行。 (2)文件与目录相关命令的使用 1.查询/bin目录,看一看有哪些常用的命令文件在该目录下: ll /bin 2.进入/tmp目录下,新建目录myshare: cd /tmp mkdir myshare ls –ld myshare/ 3.用pwd命令查看当前所在的目录: pwd 4.新建testfile文件: touch testfile ls -l 5.设置该文件的权限模式: chomd 755 testfile ls -l testfile 6.把该文件备份到/tmp/myshare目录下,并改名为testfile.bak: cp testfile myshare/testfile.bak ls -l myshare/ 7.在/root目录下为该文件创建1个符号连接: ln -s /tmp/testfile /root/testfile.ln ls -l /root/testfile.ln 8.搜索inittab 文件中含有initdefault字符串的行: cat /etc/inittab | grep initdefault (3)磁盘管理与维护命令的使用 1)Linux 下使用光盘步骤 1.确认光驱对应的设备文件: ll /dev/cdrom 2.挂载光盘: mout -t iso9600/dev/cdrom test/dir 1.查询挂载后的目录: ll /media/cdrom 2.卸载光盘: umount /dev/cdrom 2)Linux下USB设备的使用

探究linux内核,超详细解析子系统

探究linux内核,超详细解析子系统 Perface 前面已经写过一篇《嵌入式linux内核的五个子系统》,概括性比较强,也比较简略,现在对其进行补充说明。 仅留此笔记,待日后查看及补充!Linux内核的子系统 内核是操作系统的核心。Linux内核提供很多基本功能,如虚拟内存、多任务、共享库、需求加载、共享写时拷贝(Copy-On-Write)以及网络功能等。增加各种不同功能导致内核代码不断增加。 Linux内核把不同功能分成不同的子系统的方法,通过一种整体的结构把各种功能集合在一起,提高了工作效率。同时还提供动态加载模块的方式,为动态修改内核功能提供了灵活性。系统调用接口用户程序通过软件中断后,调用系统内核提供的功能,这个在用户空间和内核提供的服务之间的接口称为系统调用。系统调用是Linux内核提供的,用户空间无法直接使用系统调用。在用户进程使用系统调用必须跨越应用程序和内核的界限。Linux内核向用户提供了统一的系统调用接口,但是在不同处理器上系统调用的方法

各不相同。Linux内核提供了大量的系统调用,现在从系统 调用的基本原理出发探究Linux系统调用的方法。这是在一个用户进程中通过GNU C库进行的系统调用示意图,系 统调用通过同一个入口点传入内核。以i386体系结构为例,约定使用EAX寄存器标记系统调用。 当加载了系统C库调用的索引和参数时,就会调用0x80软件中断,它将执行system_call函数,这个函数按照EAX 寄存器内容的标示处理所有的系统调用。经过几个单元测试,会使用EAX寄存器的内容的索引查system_call_table表得到系统调用的入口,然后执行系统调用。从系统调用返回后,最终执行system_exit,并调用resume_userspace函数返回用户空间。 linux内核系统调用的核心是系统多路分解表。最终通过EAX寄存器的系统调用标识和索引值从对应的系统调用表 中查出对应系统调用的入口地址,然后执行系统调用。 linux系统调用并不单层的调用关系,有的系统调用会由

linux添加系统调用实验步骤

首先,进入到内核源码目录/usr/src/linux-2.6.34中,添加自己的系统调用号。 lyh@lyh:~$ cd /usr/src/linux-2.6.34/ 系统调用号在unistd_32.h文件中定义。内核中每个系统调用号都是 以“__NR_"开头的,在该文件中添加自己的系统调用号 lyh@lyh:/usr/src/linux-2.6.34$ sudo vim arch/x86/include/asm/unistd_32.h #define __NR_pwritev 334 #define __NR_rt_tgsigqueueinfo 335 #define __NR_perf_event_open 336 #define __NR_recvmmsg 337 #define __NR_mycall 338 #ifdef __KERNEL__ #define NR_syscalls 339 在内核源文件中该行为#define NR_syscalls 338,在系统调用执行的过程中,system_call()函数会根据该值来对用户态进程的有效性进行检查。如果这个号大于或等于NR_syscalls,系统调用处理程序终止。所以应该将原来的#define NR_syscalls 338修改为#define NR_syscalls 339 其次,在系统调用表中添加相应的表项 (1)lyh@lyh:/usr/src/linux-2.6.34$ sudo vim arch/x86/kernel/syscall_table_32.S ENTRY(sys_call_table) .long sys_restart_syscall .long sys_exit ………………(这里省略了部分) .long sys_rt_tgsigqueueinfo .long sys_perf_event_open .long sys_recvmmsg .long sys_mycall (2)lyh@lyh:/usr/src/linux-2.6.34$ sudo vim arch/h8300/kernel/syscalls.S #include #include

Linux系统调用详解之pdbedit

Name pdbedit ? manage the SAM database (Database of Samba Users) Synopsis pdbedit [?a] [?b passdb?backend] [?c account?control] [?C value] [?d debuglevel] [?D drive] [?e passdb?backend] [?f fullname] [??force?initialized?passwords] [?g] [?h homedir] [?i passdb?backend] [?I domain] [?K] [?L] [?m] [?M SID|RID] [?N description] [?P account?policy] [?p profile] [??policies?reset] [?r] [?s configfile] [?S script] [?t] [??time?format] [?u username] [?U SID|RID] [?v] [?V] [?w] [?x] [?y] [?z] [?Z] DESCRIPTION This tool is part of the samba(7) suite. The pdbedit program is used to manage the users accounts stored in the sam database and can only be run by root. The pdbedit tool uses the passdb modular interface and is independent from the kind of users database used (currently there are smbpasswd, ldap, nis+ and tdb based and more can be added without changing the tool). There are five main ways to use pdbedit: adding a user account, removing a user account, modifing a user account, listing user accounts, importing users accounts. OPTIONS ?L|??list This option lists all the user accounts present in the users database. This option prints a list of user/uid pairs separated by the ′:′ character. Example: pdbedit ?L sorce:500:Simo Sorce samba:45:Test User ?v|??verbose This option enables the verbose listing format. It causes pdbedit to list the users in the database, printing out the account fields in a descriptive format. Example: pdbedit ?L ?v

8第八章Linux下的系统调用

第八章 Linux下的系统调用 8.1 系统调用介绍 8.1.1 引言 系统调用是内核提供的、功能十分强大的一系列函数。它们在内核中实现,然后通过一定的方式(库、陷入等)呈现给用户,是用户程序与内核交互的一个接口。如果没有系统调用,则不可能编写出十分强大的用户程序,因为失去了内核的支持。由此可见系统调用的地位举足轻重。内核的主体可以归结为: 系统调用的集合; 实现系统调用的算法。 8.1.2 系统调用的实现流程 这里我们通过getuid()这个简单的系统调用来分析一下系统调用的实现流程。在分析这个程序时并不考虑它的底层是如何实现的,而只需知道每一步执行的功能。 首先来看一个例子: #include /* all system call need this header*/ int main() { int i=getuid(); printf(“Hello World! This is my uid: %d\n”,i); } #include是每个系统调用都必须要的头文件,当系统执行到getuid()时,根据unistd.h中的宏定义把getuid()展开。展开后程序把系统调用号__NR_getuid(24)放入eax,然后通过执行“int $0x80”这条指令进行模式切换,进入内核。int 0x80指令由于是一条软中断指令,所以就要看系统规定的这条中断指令的处理程序是什么。 arch/i386/kernel/traps.c set_system_gate(SYSCALL_VECTOR,&system_call); 从这行程序我们可以看出,系统规定的系统调用的处理程序就是system_call。控制转移到内核之前,硬件会自动进行模式和堆栈的切换。现在控制转移到了system_call,保留系统调用号的最初拷贝之后,由SAVE_ALL来保存上下文,得到该进程结构的指针,放在ebx里面,然后检查系统调用号,如果__NR_getuid(24)是合法的,则根据这个系统调用号,索引sys_call_table,得到相应的内核处理程序:sys_getuid。执行完sys_getuid之后,保存返回值,从eax移到堆栈中的eax处,假设没有

linux操作系统基本命令

实验二常用命令和Vi编辑器 一.实验目的: 1.熟悉shell的常用命令; 2.掌握Linux系统终端方式使用的编辑器vi; 3.学习vi的启动、存盘、文本输入、现有文件的打开、光标移动、复制/剪贴、查找/替换等命令。 二.实验环境: Red Hat Enterprise Linux 6以上 三.实验内容: 1.练习使用shell的常用命令; 2.熟练掌握vi编辑器的使用。 四、实验练习: 1、使用Shell命令的简单操作 (1)查看当前目录命令:#pwd (2)切换目录命令:cd #cd(进入用户主目录) #cd..(回到上一级目录) #cd../..(回到上两级目录,以此类推) #cd/(进入根目录/) #cd/etc(进入目录/etc) (3)查看文件内容命令:cat

#cd/etc(进入目录/etc) #catxinetd.conf (查看/etc/xinetd.conf内容) #catxinetd.conf |more(若文件过长,分页方式查看文件内容)注意:cat命令只能查看文本文件内容,不能查看二进制文件内容 (4)查看命令帮助:man,--help,info,whatis #manls #mancp #ls --help (5)显示指定目录下的内容:ls 参考命令手册,使用ls命令结合其相关选项查看Linux的目录结构,了解各个目录存放与系统相关的文件; 2.使用Shell命令的高级操作 1)命令补齐功能 用date命令查看系统当前时间,在输入da后,按tab键,让shell自动补齐命令的后半部分。 用mkdir命令创建新的目录。首先输入第一个字母m,然后按tab键,由于以m开头的命令太多,shell会提示是否显示全部的可能命令,输入n。 再多输入一个字母k,按tab键,让shell列出以mk开头的所有命令的列表。 在列表中查找mkdir命令,看看还需要多输入几个字母才能确定mkdir这个命令,然后输入需要的字母,再按tab键,让shell补齐剩下的命令。 最后输入要创建的目录名,按回车键执行命令。 多试几个命令利用tab键补齐。

linux系统调用

2002 年 3 月 01 日 本文列出了大部分常见的Linux系统调用,并附有简要中文说明。 以下是Linux系统调用的一个列表,包含了大部分常用系统调用和由系统调用派生出的的函数。这可能是你在互联网上所能看到的唯一一篇中文注释的Linux系统调用列表,即使是简单的字母序英文列表,能做到这么完全也是很罕见的。 按照惯例,这个列表以man pages第2节,即系统调用节为蓝本。按照笔者的理解,对其作了大致的分类,同时也作了一些小小的修改,删去了几个仅供内核使用,不允许用户调用的系统调用,对个别本人稍觉不妥的地方作了一些小的修改,并对所有列出的系统调用附上简要注释。 其中有一些函数的作用完全相同,只是参数不同。(可能很多熟悉C++朋友马上就能联想起函数重载,但是别忘了Linux核心是用C语言写的,所以只能取成不同的函数名)。还有一些函数已经过时,被新的更好的函数所代替了(gcc在链接这些函数时会发出警告),但因为兼容的原因还保留着,这些函数我会在前面标上“*”号以示区别。 一、进程控制: fork 创建一个新进程 clone 按指定条件创建子进程 execve 运行可执行文件 exit 中止进程 _exit 立即中止当前进程 getdtablesize 进程所能打开的最大文件数 getpgid 获取指定进程组标识号 setpgid 设置指定进程组标志号 getpgrp 获取当前进程组标识号 setpgrp 设置当前进程组标志号 getpid 获取进程标识号 getppid 获取父进程标识号 getpriority 获取调度优先级 setpriority 设置调度优先级 modify_ldt 读写进程的本地描述表 nanosleep 使进程睡眠指定的时间 nice 改变分时进程的优先级 pause 挂起进程,等待信号 personality 设置进程运行域 prctl 对进程进行特定操作 ptrace 进程跟踪 sched_get_priority 取得静态优先级的上限 _max sched_get_priority 取得静态优先级的下限 _min sched_getparam 取得进程的调度参数 sched_getscheduler 取得指定进程的调度策略 sched_rr_get_inter 取得按RR算法调度的实时进程的时间片长度 val sched_setparam 设置进程的调度参数 sched_setscheduler 设置指定进程的调度策略和参数

Linux操作系统及常用命令

Linux提供了大量的命令,利用它可以有效地完成大量的工 作,如磁盘操作、文件存取、目录操作、进程管理、文件权限设定等。所以,在Linux系统上工作离不开使用系统提供的命令。 下面我将比较常用的命令,按照系统中的作用分成以下6个部分 安装和登录命令:shutdown、reboot、install、mount、umount、exit、last; 文件处理命令:file、mkdir、grep、find、mv、ls、diff、cat; 系统管理相关命令:df、top、free、adduser、groupadd、kill、crontab; 网络操作命令:ifconfig、ping、netstat、telnet、ftp、route、scp、finger; 系统安全相关命令:passwd、su、chmod、chown、sudo、ps、who; 其它命令:tar、unzip、unarj、man 安装与登陆命令 shutdown 1.作用 shutdown命令的作用是关闭计算机,它的使用权限是超级用户root。 2.格式 shutdown [-h][-i][-k][-m][-t] 3.重要参数 -t:在改变到其它运行级别之前,告诉init程序多久以后关机。 -k:并不真正关机,只是送警告信号给每位登录者。 -h:关机后关闭电源。 -c:cancel current process取消目前正在执行的关机程序。所以这个选项当然没有时间参数,但是可以输入一个用来解释的讯息,而这信息将会送到每位使用者。 -F:在重启计算机时强迫fsck。 -time:设定关机前的时间。 -m: 将系统改为单用户模式。 -i:关机时显示系统信息。 -r:重启。 4.实用例子 远程重启满天星服务器192.168.0.25 shutdown -m \\192.168.0.25 -r -f -t 0 远程重启兴通博服务器192.168.0.41 shutdown -m \\192.168.0.41 -r -f -t 0 reboot 1.作用 reboot命令的作用是重新启动计算机,它的使用权限是系统管理者root。 2.格式

linux系统调用和文件操作

零、本课程能学到的内容 1、文件系统及文件的IO操作。 2、linux的多进程编程。 3、linux的多线程编程。 4、进程及线程之间的同步和异步通信 5、linux的网络编程(编写服务器、客户端、TCP、UDP程序)。 一、linux的系统调用 用户程序通过软中断的方式,让cpu切换到内核态运行,数据就借此传输。 对于CPU来说,它不知道现在运行是用户程序还是内核程序。软中断后,cpu根据拿到的数据,进行特定的任务,然后退出中断,将任务的结果交回给用户程序。 这个任务如何描述?是通过数字来编号的。 例子:写一个打印字符串的程序,通过系统调用来完成。 需要传递的参数有:指向字符串的指针(字符串的首地址),字符串的长度。 汇编写法 用int$0x80产生软中断 C的写法 直接使用syscall函数(它的本质就是用软中断来产生系统调用) 系统调用编号见:/usr/include/asm/unistd_32.h里 一共有358个。其中,4号对应的write调用。 二、linux文件系统基础 扇区(sector):磁头读取的最小单位数据,在磁盘上类似一个扇子的形状。一般是512个字节。 块(block):软件读取磁盘的最小单位数据,一般来说是扇区的2的n次幂大小,常用的有4096个字节。 块就是文件存放的最小单位。如果有一个文件是15045个字节,那么就分成4个块存储,最后那个块的数据是不满的。 可以用数组的方式将一个文件的所有数据块的编号保存起来。

这个数组多大合适? 前提是数组大小要固定,才好管理。 用一个15元素的数组来保存数据块的编号。 其中0-11元素,保存数据块的前面12个,第12个元素是一个一级指针,指向另一个表格,那个表格是4096字节,可以保存1024个块的编号。 如果还不够,第13个元素是一个二级指针,指向的那个表格是一级指针表格。14个元素是三级指针,指向的表格是二级指针表格。 全部用完可以存储2G大小的文件的数据块编号。 在文件系统内部,如何来表示一个文件呢? 用一个inode结构体来表示一个文件。inode是index node的意思。也叫索引节点。一个索引节点对应一个文件,有多少个文件就有多少个索引节点。 inode结构体里面有文件的大小、文件的修改时间、文件的权限、文件的数据块的编号数组。 inode结构体数组保存了所有文件的inode,这个数组的下标就是inode编号。文件名或者目录名保存目录文件的数据块里面。在linux里面,一个目录也是一个文件,叫做目录文件,其它的叫做普通文件。目录文件里就有,inode编号和文件名的对应关系。 那么,给出文件路径时,如何找到这个文件的数据块? /usr/include/stdio.h 首先,找到根目录的数据块,从里面找到文件和inode编号关系表, 例如usr这个文件名和inode编号为10002是对应的,那么就到inode结构体数组里找出下标为10002的元素,得到对应文件usr的数据块,因为usr也是一个文件夹,既然是文件夹,它的数据块里面也会有关系表,就可以找到include这个文件的数据块,最后找到stdio.h的数据块,这个是一个普通文件,就把它的数据块全部取出来。 这里搜索的起点是根目录的数据块,那么这个文件的数据块到哪里找? 在一个磁盘里面,最开始的几个块,存储了本磁盘的很多重要数据,例如块的大小,有哪些inode下标空闲,哪些已经用了,最重要的是根目录的数据块。 所有的参数存放在其中的一个块,这个块叫做超级块(super block)。在磁盘格式化,实际就是生成一个超级块。这个块的重要性毋庸置疑,如果数据被损坏,则磁盘没办法使用。 三、打开文件 在linux里面,用open函数就可以打开一个文件。 函数原型:int open(const char*path,int flag) 函数如果打开成功,则返回一个文件描述符f ile d escribtor,这个描述符fd是一个非负整数。 1、文件描述符

Linux(centos)的常用基本命令

Linux的常用基本命令。 首先启动Linux。启动完毕后需要进行用户的登录,选择登陆的用户不同自然权限也不一样,其中“系统管理员”拥有最高权限。 在启动Linux后屏幕出现如下界面显示: …… Red Hat Linux release 9 (Shrike) Kernel2.4.20.8 on an i686 login: 输入:root(管理员名)后,计算机显示输口令(password:),输入你的口令即可。当计算机出现一个“#”提示符时,表明你登录成功! 屏幕显示Linux提示符:[root@localhost root]#_ 这里需要说明的是“Red Hat Linux release 9 (Shrike)”表示当前使用的操作系统的名称及版本。“2.4.20.8”表示Linux操作系统的核 心版本编号。“i686”表示该台电脑使用的CPU的等级。 下面我们来介绍常用基本命令 一,注销,关机,重启 注销系统的logout命令 1,Logout 注销是登陆的相对操作,登陆系统后,若要离开系统,用户只要直接下达logout命令即可: [root@localhost root]#logout Red Hat Linuxrelease 9(Shike) Kernel2.4.20.8 on an i686 Login: ←回到登陆的画面 2,关机或重新启动的shutdown命令 Shutdown命令可以关闭所有程序,依照用户的需要,重新启动或关机。 参数说明如下:  立即关机:-h 参数让系统立即关机。范例如下: [root@localhost root]#shutdown –h now ←要求系统立即关机  指定关机时间:time参数可指定关机的时间;或设置多久时间后运行shutdown命令,范例如下: [root@localhost root]#shutdown now ←立刻关机

Linux文件系统调用

Linux文件系统调用 一、实验目的: (1)掌握Linux提供的文件系统调用的使用方法。 (2)熟悉文件系统的系统调用用户接口。 (3)了解操作系统文件系统的工作原理和工作方式。 二、实验内容 编写一个文件工具filetools,使其具有以下功能: 0.退出 1.创建新文件 2.写文件 3.读文件 4.修改文件权限 5.查看当前文件权限并退出。 提示用户输入功能号,并根据用户输入的功能选择相应的功能。三、参考代码 #include #include #include #include #include #include #include #include #define MAX 128 int chmd() { int c; mode_t mode=S_IWUSR; printf("0.0700\n 1.0400\n 2.0200\n 3.0100\n");//还可以增加其他权限printf("Please input your choice(0-3):"); scanf("%d",&c); switch(c) { case 0:chmod("file1",S_IRWXU);break; case 1:chmod("file1",S_IRUSR);break; case 2:chmod("file1",S_IWUSR);break; case 3:chmod("file1",S_IXUSR);break; default:printf("You have a wrong choice!\n"); } return(0); }

linux系统中的常见基本命令大全

linux系统中的常见基本命令大全 系统信息 arch显示机器的处理器架构(1) uname-m显示机器的处理器架构(2) uname-r显示正在使用的内核版本 dmidecode-q显示硬件系统部件-(SMBIOS/DMI) hdparm-i/dev/hda罗列一个磁盘的架构特性 hdparm-tT/dev/sda在磁盘上执行测试性读取操作 cat/proc/cpuinfo显示CPUinfo的信息 cat/proc/interrupts显示中断 cat/proc/meminfo校验内存使用 cat/proc/swaps显示哪些swap被使用 cat/proc/version显示内核的版本 cat/proc/net/dev显示网络适配器及统计 cat/proc/mounts显示已加载的文件系统 lspci-tv罗列PCI设备 lsusb-tv显示USB设备 date显示系统日期 cal2007显示2007年的日历表 date0412********.00设置日期和时间-月日时分年.秒 clock-w将时间修改保存到BIOS 关机(系统的关机、重启以及登出) shutdown-hnow关闭系统(1) init0关闭系统(2) telinit0关闭系统(3) shutdown-hhours:minutes&按预定时间关闭系统 shutdown-c取消按预定时间关闭系统 shutdown-rnow重启(1) reboot重启(2)

logout注销 文件和目录 cd/home进入'/home'目录' cd..返回上一级目录 cd../..返回上两级目录 cd进入个人的主目录 cd~user1进入个人的主目录 cd-返回上次所在的目录 pwd显示工作路径 ls查看目录中的文件 ls-F查看目录中的文件 ls-l显示文件和目录的详细资料 ls-a显示隐藏文件 ls*[0-9]*显示包含数字的文件名和目录名 tree显示文件和目录由根目录开始的树形结构(1) lstree显示文件和目录由根目录开始的树形结构(2) mkdirdir1创建一个叫做'dir1'的目录' mkdirdir1dir2同时创建两个目录 mkdir-p/tmp/dir1/dir2创建一个目录树 rm-ffile1删除一个叫做'file1'的文件' rmdirdir1删除一个叫做'dir1'的目录' rm-rfdir1删除一个叫做'dir1'的目录并同时删除其内容 rm-rfdir1dir2同时删除两个目录及它们的内容 mvdir1new_dir重命名/移动一个目录 cpfile1file2复制一个文件 cpdir/*.复制一个目录下的所有文件到当前工作目录 cp-a/tmp/dir1.复制一个目录到当前工作目录 cp-adir1dir2复制一个目录 ln-sfile1lnk1创建一个指向文件或目录的软链接 lnfile1lnk1创建一个指向文件或目录的物理链接

linux系统调用和库函数调用的区别

linux系统调用和库函数调用的区别 Linux下对文件操作有两种方式:系统调用(system call)和库函数调用(Library func tions)。可以参考《Linux程序设计》(英文原版为《Beginning Linux Programming》,作者是Neil Matthew和Richard Stones)第三章: Working with files。系统调用实际上就是指最底层的一个调用,在linux程序设计里面就是底层调用的意思。面向的是硬件。而库函数调用则面向的是应用开发的,相当于应用程序的api,采用这样的方式有很多种原因,第一:双缓冲技术的实现。第二,可移植性。第三,底层调用本身的一些性能方面的缺陷。第四:让api也可以有了级别和专门的工作面向。 1、系统调用 系统调用提供的函数如open, close, read, write, ioctl等,需包含头文件unistd.h。以write为例:其函数原型为size_t write(int fd, const void *buf, size_t nbytes),其操作对象为文件描述符或文件句柄fd(file descriptor),要想写一个文件,必须先以可写权限用open系统调用打开一个文件,获得所打开文件的fd,例如fd=open(\"/dev/v ideo\", O_RDWR)。fd是一个整型值,每新打开一个文件,所获得的fd为当前最大fd 加1。Linux系统默认分配了3个文件描述符值:0-standard input,1-standard o utput,2-standard error。 系统调用通常用于底层文件访问(low-level file access),例如在驱动程序中对设备文件的直接访问。 系统调用是操作系统相关的,因此一般没有跨操作系统的可移植性。 系统调用发生在内核空间,因此如果在用户空间的一般应用程序中使用系统调用来进行文件操作,会有用户空间到内核空间切换的开销。事实上,即使在用户空间使用库函数来对文件进行操作,因为文件总是存在于存储介质上,因此不管是读写操作,都是对硬件(存储器)的操作,都必然会引起系统调用。也就是说,库函数对文件的操作实际上是通过系统调用来实现的。例如C库函数fwrite()就是通过write()系统调用来实现的。 这样的话,使用库函数也有系统调用的开销,为什么不直接使用系统调用呢?这是因为,读写文件通常是大量的数据(这种大量是相对于底层驱动的系统调用所实现的数据操作单位而言),这时,使用库函数就可以大大减少系统调用的次数。这一结果又缘于缓冲区技术。在用户空间和内核空间,对文件操作都使用了缓冲区,例如用fwrite写文件,都是先将内容写到用户空间缓冲区,当用户空间缓冲区满或者写操作结束时,才将用户缓冲区的内容写到内核缓冲区,同样的道理,当内核缓冲区满或写结束时才将内核缓冲区内容写到文件对应的硬件媒介。 2、库函数调用 标准C库函数提供的文件操作函数如fopen, fread, fwrite, fclose, fflush, fseek等,需包含头文件stdio.h。以fwrite为例,其函数原型为size_t fwrite(const void *buff

Linux系统调用--semctl函数详解

【semctl系统调用】 功能描述: 在指定的信号集或信号集内的某个信号上执行控制操作。 用法: #include #include #include int semctl(int semid, int semnum, int cmd, ...); 参数: semid:信号集的标识符,即是信号表的索引。 semnum:信号集的索引,用来存取信号集内的某个信号。 cmd:需要执行的命令,有效值有 IPC_STAT //将与semid关联的内核数据结构拷贝到由arg.buf指针指向的内存区。 IPC_SET //将由arg.buf指针指向的semid_ds的一些成员写入相关联的内核数据结构,同时更新它的sem_ctime成员。 IPC_RMID //立即删除信号集,唤醒所有被阻塞的进程。 IPC_INFO //Linux特有命令,返回系统范围内关于信号集的制约和其它参数,并存放在arg.__buf指向的内存区。其结构形态如下: struct seminfo { int semmap; int semmni; int semmns; int semmnu; int semmsl; int semopm; int semume; int semusz; int semvmx; int semaem; };

SEM_INFO //返回和IPC_INFO相同的信息,不同点有:semusz字段包含有当前系统存在的信号集总量。semaem字段包含有系统内所有信号集的信号总量。 SEM_STAT //返回和IPC_STAT相同的信息。不过参数semid不是一个信号集标识,而是内核内部维持所有信号集信息的数组索引。 GETALL //将所有信号的值存入semun.array中。 GETNCNT //等待信号值增加的进程的总数。 GETPID //前一个对此信号进行操作的进程的识别码。 GETVAL //根据semnun返回信号的值。 GETZCNT //等待信号值变为0的进程的总数。 SETALL //将所有semun.array的值设定到信号集中。 SETVAL //根据semun设定信号的值。 ...:对于不同的命令,可能需要用到也可能不需要,是一个联合体,原型如下 union semun { int val; struct semid_ds *buf; unsigned short *array; struct seminfo *__buf; }; semid_ds结构体定义在,原型如下 struct semid_ds { struct ipc_perm sem_perm; time_t sem_ctime; unsigned short sem_nsems; }; ipc_perm结构体定义在,原型如下 struct ipc_perm { key_t key; uid_t uid; gid_t gid; uid_t cuid; gid_t cgid; unsigned short mode;

相关文档
最新文档