28分填空题
常见shell命令
最重要的几个系统调用比如fork返回值_文件-进程 网络编程 套接字
填图题14分(课设图)
简答题 6题: 和文件相关的基础概念 文件目录 硬软链接 管道 各自概念 本身特点 memorymapp
线程 互斥锁
两个代码题
一个读代码 一个写代码 都是和进程相关 进程的创建 运行进程上文件的函数族 回收子进程
信号和屏蔽信号
填空题:
常见shell命令:
查看(文件、目录)
1.ls(显示目录文件)
2.cat(显示文件内容)
3.tac(显示文件内容(反向列示))
4.more(分页显示文件内容)
5.less(分页显示文件内容(可向上翻页))
6.head(显示文件前面几行 -n 指定行数)
7.tail(显示文件后面几行 -n 指定行数 -f 动态显示文件末尾内容)
8.pwd(显示当前目录)
创建(目录、文件)
9.mkdir(创建新目录 -p 递归创建)
10.touch(创建空文件)
复制、剪切(目录、文件)
11.mv(也可以改名)
12.cp(复制文件或目录)
删除(目录文件)
13.rmdir(删除空目录)
14.rm(删除文件)
目录的切换
15.cd(切换目录)
文件的链接
(生成链接文件)16.ln
命令格式
命令格式:命令 [-选项] [参数] 例: ls -la /etc
说明:1)个别命令使用不遵循此格式
2)当有多个选项时,可以写在一起
3)简化选项与完整选项 -a 等于 --all
1.目录处理命令:ls
命令名称:ls
命令英文原意:list
命令所在路径:/bin/ls
执行权限:所有用户
功能描述:显示目录文件
语法:ls 选项[-ald] [文件或目录] -a 显示所有文件,包括隐藏文件 -l 详细信息显示 -d 查看目录属性
-rw-r–r–
-文件类型(- 文件 d 目录 l 软链接文件)
rw-(u) r–(g) r–(o)
rw代表u权限 r代表所属组权限 r 代表其他人权限
u所有者 g所属组 o其他人 r读 w写 x执行
2.文件处理命令:cat
命令名称:cat
命令所在路径:/bin/cat
执行权限:所有用户
语法:cat [文件名]
功能描述:显示文件内容 -n 显示行号
范例: $ cat /etc/issue $ cat -n /etc/services
3.文件处理命令:tac
命令名称:tac
命令所在路径:/usr/bin/tac
执行权限:所有用户
语法:tac [文件名]
功能描述:显示文件内容(反向列示)
范例: $ tac /etc/issue
4.文件处理命令:more
命令名称:more
命令所在路径:/bin/more
执行权限:所有用户
语法:more [文件名] (空格) 或f 翻页 (Enter) q或Q
换行 退出
功能描述:分页显示文件内容
范例: $ more /etc/services
5.文件处理命令:less
命令名称:less
命令所在路径:/usr/bin/less
执行权限:所有用户
语法:less [文件名],可使用搜索功能(/内容),按n跳转到下一个搜索结果,可以使用翻页按键。
功能描述:分页显示文件内容(可向上翻页)
范例: $ less /etc/services
6.文件处理命令:head
命令名称:head 命令
所在路径:/usr/bin/head
执行权限:所有用户 语法:head [文件名]
功能描述:显示文件前面几行 -n 指定行数
范例: $ head -n 20 /etc/services
7.文件处理命令:tail
命令名称:tail
命令所在路径:/usr/bin/tail
执行权限:所有用户
语法:tail [文件名]
功能描述:显示文件后面几行 -n 指定行数 -f 动态显示文件末尾内容
范例: $ tail -n 18 /etc/services
8.目录处理命令:pwd
命令名称:pwd
命令英文原意:print working directory
命令所在路径:/bin/pwd
执行权限:所有用户
语法:pwd
功能描述:显示当前目录
范例:$ pwd /tmp/Japan
9.目录处理命令:mkdir
命令名称:mkdir
命令英文原意:make directories
命令所在路径:/bin/mkdir
执行权限:所有用户
语法:mkdir -p [目录名]
功能描述:创建新目录 -p 递归创建
范例:$ mkdir -p /tmp/Japan/boduo
$ mkdir /tmp/Japan/longze /tmp/Japan/cangjing
10.文件处理命令:touch
命令名称:touch
命令所在路径:/bin/touch
执行权限:所有用户
语法:touch [文件名]
功能描述:创建空文件
范例: $ touch Japanlovestory.list
11.目录处理命令:mv
命令名称:mv
命令英文原意:move
命令所在路径:/bin/mv
执行权限:所有用户
语法:mv [原文件或目录] [目标目录]
功能描述:剪切文件、改名
12.目录处理命令:cp
命令名称:cp
命令英文原意:copy
命令所在路径:/bin/cp
执行权限:所有用户
语法:cp -rp [原文件或目录] [目标目录] -r 复制目录 -p 保留文件属性
功能描述:复制文件或目录
范例: $ cp -r /tmp/Japan/cangjing /root
将目录/tmp/Japan/cangjing复制到目录/root下
$ cp -rp /tmp/Japan/boduo /tmp/Japan/longze /root
将/tmp/Japan目录下的boduo和longze目录复制到 /root下,保持目录属性
13.文件处理命令:rmdir
命令名称:rmdir
命令英文原意:remove empty directories
命令所在路径:/bin/rmdir
执行权限:所有用户
语法:rmdir [目录名]
功能描述:删除空目录
范例: $ rmdir /tmp/Japan/boduo
14.目录处理命令:rm
命令名称:rm
命令英文原意:remove
命令所在路径:/bin/rm
执行权限:所有用户
语法:rm -rf [文件或目录] -r 删除目录 -f 强制执行
功能描述:删除文件
范例:
$ rm /tmp/yum.log
删除文件/tmp/yum.log
$ rm -rf /tmp/Japan/longze
删除目录/tmp/Japan/longze
15.目录处理命令:cd
命令名称:cd
命令英文原意:change directory
命令所在路径:shell内置命令
执行权限:所有用户
语法:cd [目录]
功能描述:切换目录
范例: $ cd /tmp/Japan/boduo 切换到指定目录
$ cd … 回到上一级目录
16.文件处理命令:ln
命令名称:ln
命令英文原意:link
命令所在路径:/bin/ln
执行权限:所有用户
语法:ln -s [原文件] [目标文件] -s 创建软链接
功能描述:生成链接文件
范例: $ ln -s /etc/issue /tmp/issue.soft 创建文件/etc/issue的软链接/tmp/issue.soft
$ ln /etc/issue /tmp/issue.hard 创建文件/etc/issue的硬链接/tmp/issue.hard
软链接特征:类似Windows快捷方式
1、lrwxrwxrwx l 软链接 软链接文件权限都为rwxrwxrwx
2、文件大小-只是符号链接
3、/tmp/issue.soft -> /etc/issue 箭头指向原文件
硬链接特征:
1、拷贝cp -p + 同步更新 echo “this is a test” >> /etc/motd
2、可通过i节点识别
3、不能跨分区
4、不能针对目录使用
————————————————
详细地址:
[Linux基础—兄弟连]常用命令-文件处理命令
原文地址:
[Linux基础—兄弟连]常用命令-权限管理命令
基本工具:vim 、vi、emacs
开发工具:vscode、visual stdio
代码题
代码解释:
1、什么是进程
当运行任何一个UNIX命令时,shell至少会建立一个进程来运行这个命令,所以可以把任何在UNIX系统中运行的程序叫做进程;但是进程并不是程序,进程是动态的,而程序是静态的,并且多个进程可以并发的调用同一个程序。
系统中每一个进程都包含一个task_struct数据结构,所有指向这些数据结构的指针组成一个进程向量数组,系统缺省的进程向量数据大小是512,表示系统中可同时容纳512个进程。进程的task_struct数据结构包括了进程的状态、调度信息、进程标识符等信息。
由于UNIX系统是一个多进程的操作系统,所以每一个进程都是独立的,都有自己的权限及任务,所以当某一进程失败时并不会导致别的进程失败。系统通过进程标识符来区分不同的进程,进程标识符是一个非负正数,他在任何时刻都是唯一的,当某个进程结束时,他的进程标识符可以分配给另外一个新进程。系统将标识符 0分配给调度进程,标识符1分配给初始化进程。
进程在运行期间,会用到很多资源,包括最宝贵的CPU资源,当某一个进程占用CPU资源时,别的进程必须等待正在运行的进程空闲CPU后才能运行,由于存在很多进程在等待,所以内核通过调度算法来决定将CPU分配给哪个进程。
系统在刚刚启动时,运行于内核方式,这时候只有一个初始化进程在运行,他首先做系统的初始化,然后执行初始化程序(一般是/sbin/init)。初始化进程是系统的第一个进程,以后所有的进程都是初始化进程的子进程。
如何区分父子进程:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
/*
* @brief main For the understanding of the fork()
*
* @param argc
* @param argv[]
*
* @return 在父进程中返回子进程的进程号;在子进程中返回0。
*/
int main(int argc, char *argv[])
{
pid_t pid;
int cnt = 0;
pid = fork();
if (pid == -1) {
perror("fork error");
exit(1);
} else if (pid == 0) {
printf("The returned value is %d\nIn child process!!\nMy PID is %d\n",
pid, getpid());
cnt++;
} else {
printf("The returned value is %d\nIn father process!!\nMy PID is %d\n",
pid, getpid());
cnt++;
}
printf("cnt = %d\n", cnt);
return 0;
}
————————————————
运行结果是:
The returned value is 20473
In father process!!
My PID is 20472
cnt = 1
The returned value is 0
In child process!!
My PID is 20473
cnt = 1
在语句pid=fork()之前,只有一个进程在执行这段代码,但在这条语句之后,就变成两个进程在执行了,这两个进程的几乎完全相同,将要执行的下一条语句都是if(pid == -1)……
为什么两个进程的pid不同呢,这与fork函数的特性有关。fork调用的一个奇妙之处就是它仅仅被调用一次,却能够返回两次,它可能有三种不同的返回值:
1)在父进程中,fork返回新创建子进程的进程ID;
2)在子进程中,fork返回0;
3)如果出现错误,fork返回-1;
在fork函数执行完毕后,如果创建新进程成功,则出现两个进程,一个是子进程,一个是父进程。在子进程中,fork函数返回0,在父进程中,fork返回新创建子进程的进程ID。我们可以通过fork返回的值来判断当前进程是子进程还是父进程。
pid的值为什么在父子进程中不同。“其实就相当于链表,进程形成了链表,父进程的pid(p 意味point)指向子进程的进程id, 因为子进程没有子进程,所以其pid为0.
调用fork创建子进程
//用fork创建五个进程,
for (int i = 0; i < 5; i++)
{
int pid=fork();
if(pid>0)
{
printf("this is main prgress%d\n",getpid());
}
else if(pid == 0)
{
printf("%d\n",getpid());
printf("this is fork%d\n",i);
sleep(10);
exit(0);
}
while(waitpid(-1,0,WNOHANG)>0){};
}
结果
详解wait和waitpid函数
linux下signal()函数超详细介绍
简答题:
文件存储结构
大部分的Linux文件系统(如ext2、ext3)规定,一个文件由目录项、inode和数据块组成:
目录项:包括文件名和inode节点号。
Inode:又称文件索引节点,包含文件的基础信息以及数据块的指针。
数据块:包含文件的具体内容。
先说inode
理解inode,要从文件储存说起。文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector),每个扇区储存512字节(相当于0.5KB)。
操作系统读取硬盘的时候,不会一个扇区一个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个"块"(block)。这种由多个扇区组成的"块",是文件存取的最小单位。"块"的大小,最常见的是4KB,即连续八个 sector组成一个 block。
文件数据都储存在"块"中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为"索引节点"。
inode包含文件的元信息,具体来说有以下内容:
文件的字节数。
文件拥有者的User ID。
文件的Group ID。
文件的读、写、执行权限。
文件的时间戳,共有三个:ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件上一次打开的时间。
链接数,即有多少文件名指向这个inode。
文件数据block的位置。
可以用stat命令,查看某个文件的inode信息:
stat demo.txt
总之,除了文件名以外的所有文件信息,都存在inode之中。至于为什么没有文件名,下文会有详细解释。
当查看某个文件时,会先从inode表中查出文件属性及数据存放点,再从数据块中读取数据。
请看文件存储结构示意图:在这里插入图片描述
inode的大小
inode也会消耗硬盘空间,所以硬盘格式化的时候,操作系统自动将硬盘分成两个区域。一个是数据区,存放文件数据;另一个是inode区(inode table),存放inode所包含的信息。
每个inode节点的大小,一般是128字节或256字节。inode节点的总数,在格式化时就给定,一般是每1KB或每2KB就设置一个inode。假定在一块1GB的硬盘中,每个inode节点的大小为128字节,每1KB就设置一个inode,那么inode table的大小就会达到128MB,占整块硬盘的12.8%。
查看每个硬盘分区的inode总数和已经使用的数量,可以使用df -i 命令。
查看每个inode节点的大小,可以用如下命令:
sudo dumpe2fs -h /dev/hda | grep "Inode size"
由于每个文件都必须有一个inode,因此有可能发生inode已经用光,但是硬盘还未存满的情况。这时,就无法在硬盘上创建新文件。
inode号码
每个inode都有一个号码,操作系统用inode号码来识别不同的文件。
这里值得重复一遍,Linux系统内部不使用文件名,而使用inode号码来识别文件。对于系统来说,文件名只是inode号码便于识别的别称或者绰号。表面上,用户通过文件名,打开文件。实际上,系统内部这个过程分成三步:首先,系统找到这个文件名对应的inode号码;其次,通过inode号码,获取inode信息;最后,根据inode信息,找到文件数据所在的block,读出数据。
使用ls -i命令,可以看到文件名对应的inode号码,例如:
ls -i demo.txt
目录项
Linux系统中,目录(directory)也是一种文件。打开目录,实际上就是打开目录文件。
目录文件的结构非常简单,就是一系列目录项(dirent)的列表。每个目录项,由两部分组成:所包含文件的文件名,以及该文件名对应的inode号码。
ls命令只列出目录文件中的所有文件名:
ls /etc
ls -i命令列出整个目录文件,即文件名和inode号码:
ls -i /etc
如果要查看文件的详细信息,就必须根据inode号码,访问inode节点,读取信息。ls -l命令列出文件的详细信息。
ls -l /etc
硬链接和软链接(相当于创建快捷方式,图标不能先存在)
硬链接
一般情况下,文件名和inode号码是"一一对应"关系,每个inode号码对应一个文件名。但是,Linux系统允许,多个文件名指向同一个inode号码。这意味着,可以用不同的文件名访问同样的内容;对文件内容进行修改,会影响到所有文件名;但是,删除一个文件名,不影响另一个文件名的访问。这种情况就被称为"硬链接"(hard link)。
ln命令可以创建硬链接,语法为:
ln source_file target_file
运行上面这条命令以后,源文件与目标文件的inode号码相同,都指向同一个inode。inode信息中有一项叫做"链接数",记录指向该inode的文件名总数,这时就会增加1。反过来,删除一个文件名,就会使得inode节点中的"链接数"减1。当这个值减到0,表明没有文件名指向这个inode,系统就会回收这个inode号码,以及其所对应block区域。
这里顺便说一下目录文件的"链接数"。创建目录时,默认会生成两个目录项:".“和”…"。前者的inode号码就是当前目录的inode号码,等同于当前目录的"硬链接";后者的inode号码就是当前目录的父目录的inode号码,等同于父目录的"硬链接"。所以,任何一个目录的"硬链接"总数,总是等于2加上它的子目录总数(含隐藏目录),这里的2是父目录对其的“硬链接”和当前目录下的".硬链接“。
软链接
除了硬链接以外,还有一种特殊情况。文件A和文件B的inode号码虽然不一样,但是文件A的内容是文件B的路径。读取文件A时,系统会自动将访问者导向文件B。因此,无论打开哪一个文件,最终读取的都是文件B。这时,文件A就称为文件B的"软链接"(soft link)或者"符号链接(symbolic link)。
这意味着,文件A依赖于文件B而存在,如果删除了文件B,打开文件A就会报错:“No such file or directory”。这是软链接与硬链接最大的不同:文件A指向文件B的文件名,而不是文件B的inode号码,文件B的inode"链接数"不会因此发生变化。
ln -s命令可以创建软链接,语法为:
ln -s source_file target_file
有名管道和无名管道的区别:
管道是进程间通信的方式之一
管道的分类:
1:无名管道 :可用于血缘进程间通信 (比如 父子进程)。
2:有名管道:可用于任意两个进程间通信。
有名管道:
以文件为载体的通信机制。。。。。。。。。。。。。
创建本地磁盘文件为两个进程提供通信桥梁
可以当成队列
一方写一方读管道传输单位字节
共享存储区通过memory map
消息队列的单位是消息,大小可以自定义
有名管道是单向的 所以如果想在客户端和服务器通信,
需要两个有名管道,
client通过fifos向sever传输pid和servicenum
sever通过pid创建临时管道返回信息给client
每个客户端创建属于自己的临时主管道,
原文链接:https://blog.csdn.net/u014082714/article/details/45031771