1、所有操作系统都向它们运行的程序提供服务,例如读写文件,运行程序,分配存储区,获得当前时间等
2、linux登录:登录名+口令,系统的/etc/passwd文件中存放登录信息,登录项由:
登录名,加密口令,数字用户 ID(224),数字组ID(20),注释字段,起始目录 (/home/stevens),以及shell程序(/bin/ksh)。
7个用冒号分割的字段组成。
很多比较新的系统已将加密口令移到另一个文件中
3、shell
登录后,系统先显示一些系统信息,然后就可以向shell程序键入命令。
shell是一个命令解释器,它读取用户输入,然后执行相应命令。
用户一般通过终端向shell进行输入
通常我们用的shell是Bourne shell, /bin/sh
启动时shell会先读/etc/profile文件和$HOME/.profile文件
/etc/profile为所有用户制定环境,$HOME/.profile只为当前用户制定环境
bin/sh的默认提示符号是美元符$
4、文件系统
目录起点是root,字符‘/’标识
目录是一个包含目录项的文件,同时包含文件属性的信息,例如文件名,文件长度,文件所有者,文件权限,文件最后修改时间等
stat和fstat函数可以返回一个包含文件信息的结构体
5、文件名
不能出现在文件名中的字符有两个,‘/’和‘NULL’,斜线分割造成路径名混淆,空则终止一个路径名
当创建一个新目录时,自动创建.和..两个引用文件名
6、路径名
带斜线的文件名序列构成路径名
dp = opendir(pathname);
while(dirp = readdir(dp))
{
printf("name = %s\n", dirp->d_name);
}
closedir(parhname);
查看文件属性用ls命令
7、工作目录
每一个进程都有一个工作目录,登录时,工作目录设置为家目录,该起始目录从口令文件/etc/passwd中载入
守护进程中有一步操作即是把当前进程的工作目录移动到另一个指定的目录中
8、文件描述符
是一个小的非负整数,用来标识一个正在被访问的文件,当内核打开一个现存的文件或者创建一个新文件的时候,它就会返回一个文件描述符,可以使用这个文件描述符对文件进行读写
9、
按照惯例,每当执行一个新的进程时,所有的shell都为其打开三个文件描述符,标准输入,标准输出,标准错误,如果没有经过处理,这三个描述符都默认连接终端,也可将这三个描述符重定向到一个文件,例如:
ls > file.list(执行ls命令,将ls命令打印内容写入到file.list文件上)
10、不用缓存的I/O
函数o p e n、r e a d、w r i t e、l s e e k以及c l o s e提供了不用缓存的 I / O。这些函数都用文件描述符进行工作。
int n;
char buf[BUF_SIZE];
while(n = read(STDIN_FILENO, buf, BUF_SIZE) > 0)
{
if(write(STDOUT_FILENO, buf, n) != n)
err_sys("write error");
}
if(n < 0)
err_sys("read error");
此程序实现复制一个文件的功能,两个常数STDIN_FILENO和STDOUT_FILENO定义在<unistd.h>头文件中,典型值是0和1,但是为了可移植性,我们采用宏定义
编译成a.out, 执行 ./a.out > data
就可以实现把终端上所有内容保存到一个data文件上
11、标准I/O
标准IO就是不用缓存的IO的一种带缓存的界面,使用标准IO可以不用担心任何选取BUFSIZE的最佳长度,标准IO在处理输入行上也有优势,例如fgets读取完整的一行,但是read就需要制定读取的字节数。
char c;
while(c = getc(stdin) != EOF)
if(putc(c, stdout) == EOF)
err_sys("output err");
if(ferror(stdin))
err_sys("input err");
读到最后一个字节的时候getc返回EOF
标准输入、输出常数 stdin和stdout定义在头文件<stdio.h>中,它们分别表示标准输入和标准输出文件。
12 程序和进程
程序是放在磁盘上的可执行文件,由内核将程序读入存储器,并且使其执行。
13 进程控制
三个用于进程控制的函数:fork,exec,waitpid
exec有六种变体,统称为exec
2、linux登录:登录名+口令,系统的/etc/passwd文件中存放登录信息,登录项由:
登录名,加密口令,数字用户 ID(224),数字组ID(20),注释字段,起始目录 (/home/stevens),以及shell程序(/bin/ksh)。
7个用冒号分割的字段组成。
很多比较新的系统已将加密口令移到另一个文件中
3、shell
登录后,系统先显示一些系统信息,然后就可以向shell程序键入命令。
shell是一个命令解释器,它读取用户输入,然后执行相应命令。
用户一般通过终端向shell进行输入
通常我们用的shell是Bourne shell, /bin/sh
启动时shell会先读/etc/profile文件和$HOME/.profile文件
/etc/profile为所有用户制定环境,$HOME/.profile只为当前用户制定环境
bin/sh的默认提示符号是美元符$
4、文件系统
目录起点是root,字符‘/’标识
目录是一个包含目录项的文件,同时包含文件属性的信息,例如文件名,文件长度,文件所有者,文件权限,文件最后修改时间等
stat和fstat函数可以返回一个包含文件信息的结构体
5、文件名
不能出现在文件名中的字符有两个,‘/’和‘NULL’,斜线分割造成路径名混淆,空则终止一个路径名
当创建一个新目录时,自动创建.和..两个引用文件名
6、路径名
带斜线的文件名序列构成路径名
dp = opendir(pathname);
while(dirp = readdir(dp))
{
printf("name = %s\n", dirp->d_name);
}
closedir(parhname);
查看文件属性用ls命令
7、工作目录
每一个进程都有一个工作目录,登录时,工作目录设置为家目录,该起始目录从口令文件/etc/passwd中载入
守护进程中有一步操作即是把当前进程的工作目录移动到另一个指定的目录中
8、文件描述符
是一个小的非负整数,用来标识一个正在被访问的文件,当内核打开一个现存的文件或者创建一个新文件的时候,它就会返回一个文件描述符,可以使用这个文件描述符对文件进行读写
9、
按照惯例,每当执行一个新的进程时,所有的shell都为其打开三个文件描述符,标准输入,标准输出,标准错误,如果没有经过处理,这三个描述符都默认连接终端,也可将这三个描述符重定向到一个文件,例如:
ls > file.list(执行ls命令,将ls命令打印内容写入到file.list文件上)
10、不用缓存的I/O
函数o p e n、r e a d、w r i t e、l s e e k以及c l o s e提供了不用缓存的 I / O。这些函数都用文件描述符进行工作。
int n;
char buf[BUF_SIZE];
while(n = read(STDIN_FILENO, buf, BUF_SIZE) > 0)
{
if(write(STDOUT_FILENO, buf, n) != n)
err_sys("write error");
}
if(n < 0)
err_sys("read error");
此程序实现复制一个文件的功能,两个常数STDIN_FILENO和STDOUT_FILENO定义在<unistd.h>头文件中,典型值是0和1,但是为了可移植性,我们采用宏定义
编译成a.out, 执行 ./a.out > data
就可以实现把终端上所有内容保存到一个data文件上
11、标准I/O
标准IO就是不用缓存的IO的一种带缓存的界面,使用标准IO可以不用担心任何选取BUFSIZE的最佳长度,标准IO在处理输入行上也有优势,例如fgets读取完整的一行,但是read就需要制定读取的字节数。
char c;
while(c = getc(stdin) != EOF)
if(putc(c, stdout) == EOF)
err_sys("output err");
if(ferror(stdin))
err_sys("input err");
读到最后一个字节的时候getc返回EOF
标准输入、输出常数 stdin和stdout定义在头文件<stdio.h>中,它们分别表示标准输入和标准输出文件。
12 程序和进程
程序是放在磁盘上的可执行文件,由内核将程序读入存储器,并且使其执行。
13 进程控制
三个用于进程控制的函数:fork,exec,waitpid
exec有六种变体,统称为exec