man,help,info
分层树形结构
ls pwd cd mkdir rmdir mv rm wc find grep gzip gunzip tar
三种权限:
+ 读read(r)
+ 写write(w)
+ 执行execute(x)。
文件用户分为三种类型
+ 文件的所有者(user)
+ 群组(group)
+ 其他人(others)
用三个位来表示该类用户的文件存取权限,因此每一类的文件用户可以有8种可能的操作权限。
更改文件或目录的所有者命令chomd
mount,umount:分别用于挂载、卸载指定的文件系统。
ps kill command command& fg bg 输入重定向(<) 输出重定向(>) 管道命令(|) passwd date whoami hostname uname useradd
ifconfig ifup ifdown ping netstat arp telnet ftp
su chmod chown ps who top free kill &
echo
位置参数的设置
set [option] argument_list
用argument_list中的值来设置位置参数、标志、选项和位置参数
设置环境变量和用户自定义变量
格式:variable=value
变量引用:shell中在变量名前面加一个$字符来访问它的内容
变量引用和引号使用:一般情况下,脚本文件中的参数异空白字符分隔(如空格、制表符或换行符),如果一个参数中包含空白字符,就必须加上引号。使用双引号可引用除"$"、"'"和"\"外的任意字符或字符串。单引号将值括起来不允许变量替换。反斜杠()可以用来去除某些字符的特殊意义
Linux的bash变量的值是以字符串格式存放的,要进行算法逻辑运算就必须转换为整数。
+ let命令
+ $((expression))扩展
+ expr命令
函数名( )
{
函数体
}
-ansi -c -g -l
-m -o -O -pg
-S -v -w -W
-c 生成目标文件(.o)
-S 生成汇编文件(.s)
-E 预编译
-g 在执行代码中包含调试信息
-o file 把文件输出到file中
-v 显示gcc版本信息
-I dir 在头部文件的搜索路径中添加dir目录
-L dir 在库文件的搜索路径中添加dir
-static 链接静态库
-llibrary 连接名为library的库文件
-d -f -n -s
1. 读入所有的makefile文件。
2. 读入被include包括的其他makefile文件。
3. 初始化文件中的变量。
4. 推导隐式规则,并分析所有规则。
5. 为所有的目标文件创建依赖关系链。
6. 根据依赖关系,决定哪些目标要重新生成。
7. 执行生成命令。
一)、数学函数的使用
sqrt rand srand等等
二)、字符函数的使用
isalnum isalpha isascii等等
三)、系统时间与日期函数的使用
1)、普通函数
Asctime Ctime Gettimeofday Gmtime Localtime等等
2)、结构体tm
struct tm
{
int tm_sec ; /*代表目前秒数,正常范围为0-59,但允许至61秒*/
int tm_min ; /* 代表目前分数,范围0-59 */
int tm_hour ; /* 从午夜算起的时数,范围为0-23 */
int tm_mday ; /* 目前月份的日数,范围01-31 */
int tm_mon ; /* 代表目前月份,从一月算起,范围从0-11 */
int tm_year ; /* 从1900 年算起至今的年数*/
int tm_wday ; /* 一星期的日数,从星期一算起,范围为0-6 */
int tm_yday ; /* 从今年1月1日算起至今的天数,范围为0-365 */
int tm_isdst ; /* 日光节约时间的旗标*/
};
3)、结构体timeval
struct timeval{
long tv_sec; /*秒*/
long tv_usec; /*微秒*/
};
4)、结构体timezone
struct timezone
{
int tz_minuteswest; /*和Greenwich 时间差了多少分钟*/
int tz_dsttime; /*日光节约时间的状态*/
};
四)、环境控制函数
getenv putenv/setenv
五)、内存分配函数
calloc malloc getpagesize mmap mummap
六)、数据结构中常用函数
Bsearch lfind lsearch qsort
一)、Linux系统文件和文件系统
文件除了包含内容外,还包含文件名和一些属性(即"管理信息":文件创建/修改日期、访问权限、文件长度及在磁盘上存放位置)。 这些属性保存在文件的inode (索引节点)中。系统使用的是文件的inode编号
1)、文件类型:
普通文件(-)、目录文件(d)、符号链接文件(l)、字符设备文件(c)、块设备文件(b)、管道文件(p)、socket文件(s)等
2)、Linux文件权限
S_IRUSR 所有者具有读权限
S_IWUSR 所有者具有写权限
S\_IXUSR 所有者具有执行权限
S\_IRGRP 组具有读权限
S\_IWGRP 组具有写权限
S\_IXGRP 组具有执行权限
S\_IROTH 其他用户具有读权限
S\_IWOTH 其他用户具有写权限
S\_IXOTH 其他用户具有执行权限
3)、结构体stat
二)、不带缓存的文件I/O操作
不带缓存的文件I/O操作包括系统调用或API的I/O操作,是由操作系统提供的,符合POSIX标准,设计的程序能在各种支持POSIX标准的操作系统中方便移植。
1)、一般函数:
creat、open、close、read、write、lseek、flock、fcntl
2)、文件的非阻塞操作
文件的读写操作中还有一个阻塞和非阻塞问题。非阻塞打开文件时用flags的一个值O_NONBLOCK来表示,read/write就不会阻塞。
要让文件非阻塞操作时,设置flag |=O_NONBLOCK
要让文件阻塞操作时,设置flag &=~O_NONBLOCK
三)、带缓存的流文件I/O操作
带缓存的流文件I/O操作称为标准I/O操作,符合ANSI标准。在内存中开辟了一个缓存区,为程序中的每一个文件使用。带缓存的件I/O操作比不带缓存的I/O操作程序更方便移植。
1)、主要函数:
fopen、fclose、fread、fwrite、fseek、ftell、rewind、fgetc、fputc、fgets、fputs
四)、命令行参数和特殊文件操作
1)、向程序传递参数
int main(int argc, char *argv[])
2)、一些函数:
getopt getopt\_long
**第六章、进程控制**
一)、什么是进程
一个其中运行着一个或多个线程的地址空间和这些线程所需要的
系统资源,每个运行着的程序实例构成一个进程,进程是由程序代码,数据,变量(占用着系统内存),打开的文件(文件描述符)和环境组成
二)、进程的结构
正文段,用户数据段,系统数据段
1)、进程表
它把当前加载到内存中的所有进程的有关信息保存在一个表中,其中包括进程的PID、进程的状态、命令字符串和其他一些PS命令输出的各类信息,OS通过进程的PID对它们进行管理
2)、查看进程
ps指令
3)、进程调度
nice( ) 改变一个普通进程的优先级
getpriority( ) 取得一组普通进程的最大优先级
setpriority( ) 设置一组普通进程的优先级
sched_getscheduler( ) 取得一个进程的调度策略
sched_setscheduler( ) 设置一个进程的调度策略和优先级
sched_getparam( ) 取得一个进程的调度优先级 sched_setparam( ) 设置一个进程的优先级
sched_yield( ) 不阻塞的情况下自愿放弃处理机
sched_get_ priority_min( ) 取得某种策略的最小优先级
sched_get_ priority_max( ) 取得某种策略的最大优先级
三)、启动新进程
1)、一些函数:
调用库函数system()
fork wait waitpid
2)、僵尸进程
fork调用之后子进程便有一个父进程,有两种情况:
父进程先于子进程终止,init进程接管该子进程(孤儿进程)。
子进程先于父进程而终止,退出的进程被置于僵死态,占据内核维护的进程控制表中的一项,但不使用其它的内核资源,即该进程成为一个僵死进程。
3)、僵尸进程解决办法
通过信号机制
通过调用fork两次避免僵死进程原理是将子进程成为孤儿进程,从而其的父进程变为init进程,通过init进程可以处理僵尸进程
我们知道Linux在服务器端的占比超过90%,尤其是web端,几乎所有公司的后台全部都是Linux的系统。Windows由于成熟的图形界面而在pc端风光无限,但是服务器由于其较高的并发以及cpu负荷较高,windows无法负担,Linux便很适合。我认为学习Linux不仅仅是深入连接Linux那么简单,因为Linux的终端概念,我对cmd也有了更深的理解,它是一个shell外壳,翻译指令给内核。Linux有shell脚本,windows有bat批处理文件,使用了这么久的windows,我完全没有想过这些问题。我对c/c++比较感兴趣,在windows下IDE的过度使用,对编译和调试的理解虽然知道有gcc,g++,gdb之类的东西,但是没有实际操作过,理解很浅。学习了Linux,我也知道了编译c/c++的完整过程,也算是深刻理解吧。我之前接触过cmake,知道它是一种跨平台的工具,在Linux中生成makefile文件,在windows中产生sln文件等等,学习makefile也算是对先前的知识做一个强化理解。今后的学习我们将更多的涉及操作系统方面的知识,比如文件操作,进程,线程,进程通信等等。学习Linux的意义不仅仅是Linux,而是和Linux相关,和操作系统相关,和c/c++相关的一系列知识。
1)、说实话,vim是一大利器,但是熟练掌握vim的代价太高了,vim的主要吸引点是它能真正解放鼠标,使我们编程速度有个个质的飞跃,但是掌握vim的快捷键太难了,vim配置也相比较IDE麻烦。
2)、C语言,我们虽然之前学过C语言,但是我们的学习说实话是停留在windows的黑框界面中,停留在语法,数据结构,算法上,没有落实到操作系统,没有落实到进程,线程等计算机真正相关的领域,没有一个整合和过程。我们希望通过Linux这门课程,我们可以对c语言的认识不仅停留在这是一门语言上,而更多的是认识这是一门编写了linux,unix的语言,这是一门面向操作系统,面向底层的语言。
3)、进程以及线程的概念。因为我们没有立体接触过,比较生疏,理解还是需要时间的。