【nuaa操作系统实验】第一次作业——基本命令

本文详细介绍了Windows和Linux文件系统的差异,包括路径分隔符、目录结构,以及文件系统调用的函数如open(),create(),close(),read(),write()的使用。还展示了两个C语言示例:mycat.c和mycd.c,分别实现文件内容显示和文件复制功能。
摘要由CSDN通过智能技术生成


1. 文件系统

  • Windows文件系统与Linux文件系统的差异:
  1. 文件名分割符不同

Windows:路径名分割符’'。eg:C:\Windows\notepad.exe。
问题:路径分割符与许多编程语言的转义字符相同。eg:在C程序中打开C:\Windows\readme.txt
-> false:fopen(“C:\Windows\readme.txt”, “r”)
-> true:fopen(“C:\Windows\readme.txt”, “r”)

Linux:路径名分割符’/'。eg:/usr/bin/gcc
优势:路径分割符与许多编程语言的转义字符都不同。eg:在C程序中打开/usr/include/stdio.h
-> 直观:fopen(“/usr/include/stdio.h”, “r”)

  1. 路径结构不同

Windows:盘符 C: + 盘内路径 \Windows\notepad.exe
Linux:绝对路径从唯一的根目录开始,整个系统只有一个根目录’/',没有盘符概念。eg:/usr/bin/gcc

2. 目录管理

  • ls:罗列出目录下的所有文件

在这里插入图片描述

  • pwd:显示当前工作目录

在这里插入图片描述

  • cd:改变工作目录(进入指定工作目录)

在这里插入图片描述

  • mkdir:创建目录

在这里插入图片描述

  • 用户主目录

Linux是一个多用户操作系统,系统中存在多个用户,每一个用户都有一个专属于自己的主目录,用户主目录位于/home目录下,以用户名作为目录名称,通常情况下,用户只能修改自己主目录下的文件。
假如系统中有3个普通用户tom、jerry和guest:

用户tom的主目录为/home/tom
用户jerry的主目录为/home/jerry
用户guest的主目录为/home/guest

在shell中,符号~代表用户的主目录,假设用户的主目录是/home/guest,cd ~的功能与cd /home/guest的功能等价。
在这里插入图片描述
命令id显示当前用户名称为cherry,因此用户的主目录为/home/cherry。

3. 文件管理

  • touch:创建一个任意类型的空文件

在这里插入图片描述

  • cat:将文件内容输出到屏幕上

在这里插入图片描述

  • cp -r [源文件] [目标文件]:复制文件

  • rm:删除文件和目录

  • mv [源文件] [目标文件]:移动文件到指定目录/更改文件名称

4. 文件系统调用

4.1 打开文件

  • 原型
#include <sys/stat.h>
#include <fcntl.h>

int open(const char *pathname, int flags);
  • 功能

打开已有的文件:如果打开失败,返回-1;如果打开成功,返回值>=0,作为被打开文件的标识符,该整数被称为文件描述符。

  • 参数

pathname,指定文件路径
flags, 指定打开参数,可选的取值如下:

O_RDONLY 以只读方式打开
O_WRONLY 以只写方式打开
O_RDWR 以读写方式打开
O_APPEND 以追加模式打开,写文件时将内容追加文件末尾
O_TRUNC 如果文件存在,将文件的长度截断为0
O_CREAT 如果文件不存在,创建一个新文件

flags的取值可以用位或的方式进行组合

open(“log.txt”, O_RDWR | O_TRUNC);

4.2 创建文件

  • 原型
#include <sys/stat.h>
#include <fcntl.h>

int creat(const char *pathname, mode_t mode);
int open(const char *pathname, int flags, mode_t mode);
  • 功能

如果文件存在,则打开文件;如果文件不存在,则创建文件。

creat(path, mode) = open(path, O_CREAT|O_WRONLY|O_TRUNC, mode)

  • 返回值

如果创建失败,返回-1;如果创建成功,返回值>=0,作为被创建文件的标识符,该整数被称为文件描述符

  • 参数

pathname:指定文件路径
flags:指定打开参数,可选的取值与open相同
mode:新建文件的访问模式

4.3 关闭文件

  • 原型
#include <unistd.h>

int close(int fd);
  • 功能

将打开的文件关闭。操作系统需要为打开的文件分配资源,需要及时关闭不再使用的文件,从而释放相应资源。

  • 参数

fd,使用open或者creat打开的文件描述符

4.4 读取文件

  • 原型
#include <unistd.h>

int read(int fd, void *buf, size_t count);
  • 功能

从打开的文件中读取数据到内存缓冲区。如果读取失败,返回-1;如果读取成功,返回实际读取的字节个数;返回0则代表读取到了文件末尾。

  • 参数

fd:使用open或者creat打开的文件描述符
buf:内存缓冲区的起始位置
count:内存缓冲区的长度,read的返回值小于等于count

4.5 写入文件

  • 原型
#include <unistd.h>

int write(int fd, void *buf, size_t count);
  • 功能

把内存缓冲区的数据写入到打开的文件。如果写入失败,返回-1;如果写入成功,返回实际写入的字节个数。

  • 参数

fd, 使用open或者creat打开的文件描述符
buf, 内存缓冲区的起始位置
count, 内存缓冲区的长度,write的返回值小于等于count

5. 作业

  1. mycat.c

功能:实现cat功能(显示文件内容)
使用说明:
(1) gcc -o mycat mycat.c // 此命令用于将mycat.c编译成可执行文件
(2) ./mycat text // 此命令将text文件中的内容显示到屏幕上

  • 代码
#include<stdio.h>
#include<fcntl.h>
#include<unistd.h>

int main(int argc, char* argv[]){
	char *filename;
	if(argc < 2)
		printf("lack of paramenters");
	else if(argc == 2)
		filename = argv[1];
	else
		printf("too many paramenters");

	int fd, n;
	char buf[BUFSIZ];
	fd = open(filename, O_RDONLY);
	if(fd == -1)
		printf("Open Failed");
	else
		while((n = read(fd, buf, BUFSIZ)) > 0)
			puts(buf);
	close(fd);
}
  1. mycd.c

功能:复制文件(mycd text1 text2 --> 将text1文件内容复制到text2文件中)
使用说明:
(1) gcc -o mycd mycd.c // 将mycd.c编译成可执行文件
(2) ./mycd text file // 将text文件内容复制到file文件中
(3) ./mycat file // 显示文件是否已复制进来

#include<stdio.h>
#include<fcntl.h>
#include<unistd.h>

#define PERMS 0666 // 默认权限

int main(int argc, char *argv[]){
	char *filename1, *filename2;
	if(argc < 3)
		printf("lack of paramenters");
	else if(argc == 3){
		filename1 = argv[1];
		filename2 = argv[2];
	}
	else
		printf("too many paraments");

	int fd1, fd2, n;
	char buf[BUFSIZ];
	fd1 = open(filename1, O_RDONLY);
	if(fd1 == -1)
		printf("Open %s failed", filename1);
	fd2 = creat(filename2, PERMS);
	if(fd2 == -1)
		printf("Create %s failed", filename2);
	while((n = read(fd1, buf, BUFSIZ)) != -1)
		if(write(fd2, buf, n) != n)
			printf("Write error on file %s", filename2);

	close(fd1);
	close(fd2);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值