教你手写cat指令

Linux学习日记

01.教你使用系统调用手写cat指令

文章开始之前,先介绍几个指令

编译

cc demo.c  -o   demo

这样在当前目录下编译出一个可执行文件 demo

执行

./demo

若想直接 demo来执行程序,因为在 $PATH中没有当前目录, 所以系统不认识 demo。所以要用 ./来指定当目录。也可以将当前目录添加入 $PATH 中。(但不建议这样使用哦)

$PATH=.:$PATH  #因为$PATh中的文件路径是由:连接的

[root@localhost c]# echo $PATH
/usr/local/maven/apache-maven-3.9.5/bin:/usr/local/jdk/jdk1.8.0_381/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

编写myCat.c文件

首先想想cat的作用,cat的就是读取文件然后打印在控制台上,cat 文件名,那只要我们的程序能打开文件、读取文件、打印读取内容即可。

首先在当前目录创建myCat.c,然后开始正式编写,以以下步骤进行。

1.打开文件

我们可以使用man指令来查看文档。一开始不知道使用什么系统调用,只知道是打开文件的系统调用,那么这个系统调用的名字应该与open有关,那么可以使用man的检索功能:

man -k open | grep \(2  #在man手册中,系统调用是第二章,\是转义字符

输出如下:

[root@localhost c]# man -k open|grep \(2
creat (2)            - open and possibly create a file or device
flock (2)            - apply or remove an advisory lock on an open file
mq_open (2)          - open a message queue
name_to_handle_at (2) - obtain handle for a pathname and open file via a handle
open (2)             - open and possibly create a file or device
open_by_handle_at (2) - obtain handle for a pathname and open file via a handle
perf_event_open (2)  - set up performance monitoring
epoll_create (2)     - open an epoll file descriptor
epoll_create1 (2)    - open an epoll file descriptor
openat (2)           - open a file relative to a directory file descriptor

可以看到open指令。

使用man查看open系统调用的文档 man 2 open

OPEN(2)                                                                                  Linux Programmer's Manual                                                                              
NAME
       open, creat - open and possibly create a file or device

SYNOPSIS
       #include <sys/types.h>
       #include <sys/stat.h>
       #include <fcntl.h>

       int open(const char *pathname, int flags);
       int open(const char *pathname, int flags, mode_t mode);

       int creat(const char *pathname, mode_t mode);

DESCRIPTION
       Given  a  pathname for a file, open() returns a file descriptor, a small, nonnegative integer for use in subsequent system calls (read(2), write(2), lseek(2), fcntl(2), etc.).  The file descriptor
       returned by a successful call will be the lowest-numbered file descriptor not currently open for the process.
......

现在进入myCat文件,将查到的open系统调用的头文件、系统调用用上

 #include <sys/types.h>
 #include <sys/stat.h>
 #include <fcntl.h>
//ac是参数的个数,av是字符串数组,因为指令为`cat 文件名`,所以有两个参数
main(int ac,char *av[]){
    int fd;
    
     if(ac<2){
                printf("USE:CMD FILENAME");
                exit(1);
        }


        if((fd=open(av[1],O_RDONLY))==-1){   //O_RDONLY是打开文件的模式,类似于c语言打开文件函数的r,具体的参数可以使用上面的man 2 open查看
                perror("Cannot open");
                exit(-1);
        }
        printf("%d\n",fd);
}

在这段代码中,open系统调用返回的fd是什么意思呢?这就与linux操作系统有关:

image-20231102120245265

说明

每一个进程都有一个打开文件表,记录着每一个被当前进程打开的文件的信息(打开方式、读写指针等等)。fd就是当前进程这个文件在打开文件表中的索引。

2.读取文件、打印读取内容

怎么找读取文件文档的步骤和第一步一样,就不多赘述了。

READ(2)                                                                                  Linux Programmer's Manual                                                             

NAME
       read - read from a file descriptor

SYNOPSIS
       #include <unistd.h>

       ssize_t read(int fd, void *buf, size_t count);

编写myCat.c

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
main(int ac,char *av[]){
        int fd;
        int n;

   	  char buf[1024];

        if(ac<2){
                printf("USE:CMD FILENAME");
                exit(1);
        }


        if((fd=open(av[1],O_RDONLY))==-1){
                perror("Cannot open");
                exit(-1);
        }
        printf("%d\n",fd);

        while((n=read(fd,buf,sizeof(buf)))>0){
                printf("%.*s",n,buf);
        };

}

以上,myCat已经编写完毕,运行试试!!!

3.运行

到myCat.c的目录中

编译:

cc myCat.c -o myCat

执行:

./myCat /usr/include/stdio.h

看到打印内容就是成功了。

以上,myCat已经编写完毕,运行试试!!!

以上是本人在课上学习到的内容,如有错误请指出!!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Delphi是一种强大的集成开发环境,可以帮助开发者创建各种应用程序。要获取手写板的指令,我们可以使用Delphi提供的相关功能和组件。下面是使用Delphi获取手写指令的一般步骤: 1. 打开Delphi集成开发环境,创建一个新的项目。 2. 在项目中添加一个TForm对象,用于显示手写板的指令。 3. 添加一个TActiveForm对象,用于与手写板进行交互。 4. 在TActiveForm对象中添加一个TInkingSurface对象,用于捕捉手写板上的笔迹。 5. 在TActiveForm对象的OnCreate事件处理程序中,初始化手写板并连接到系统。 6. 编写TActiveForm对象的OnGesture事件处理程序,用于捕捉手写板上的手势操作,例如滑动、旋转、缩放等。 7. 编写TActiveForm对象的OnStroke事件处理程序,用于捕捉手写板上的笔迹,并在TForm对象上显示。 8. 在TForm对象中的OnActivate事件处理程序中,将TActiveForm对象显示在屏幕上,以便与手写板进行交互。 9. 编译和运行程序,将手写板连接到计算机,并开始获取手写板的指令。 通过上述步骤,我们可以使用Delphi来获取手写板的指令,并将其显示在应用程序的界面上。开发者可以根据自己的需求进一步处理手写板的指令,比如保存为图像、进行识别等。Delphi提供了丰富的功能和组件,使得获取手写指令变得简单和灵活。 ### 回答2: Delphi是一种编程语言和集成开发环境(IDE),可以用于开发Windows桌面应用程序。要获取手写板的指令,可以按照以下步骤进行: 1. 引入相关单元:首先,在Delphi项目中引入相关的单元,这些单元通常用于处理用户输入设备,例如"Tablet"或"Pen"。 2. 初始化手写板:在应用程序启动时,初始化手写板,通过调用相应的函数或方法来注册手写板设备,并设置相应的参数,如图像采样率、压感灵敏度等。 3. 监听手写板事件:在需要获取手写指令的地方,例如在画板或编辑框上,设置事件处理程序来监听手写板事件。这些事件包括手写板移动、点击、释放、悬停等。 4. 处理手写板事件:当手写板事件发生时,事件处理程序将被触发。通过处理程序中提供的信息,可以获取手写板的指令。例如,可以获取笔迹的坐标、速度、压力等信息。 5. 解析手写指令:根据获取的手写指令进行相关处理。例如,可以将手写板的笔迹转换为文本,用于录入或识别。或者可以使用手写指令来实现绘图、签名、手势操作等功能。 总结而言,通过在Delphi中引入相关单元,初始化手写板,监听手写板事件,并在事件处理程序中获取和解析手写板的指令,就可以实现获取手写指令的功能。 ### 回答3: Delphi是一种支持使用Object Pascal编程语言的集成开发环境(IDE),可以用于开发各种应用程序。要获取手写板的指令,可以通过以下步骤在Delphi中进行操作: 1. 首先,确保您已经连接了手写板设备到计算机,并在操作系统中正确安装了相关驱动程序。 2. 在Delphi中创建一个新的应用程序项目。选择“文件”->“新建”->“应用程序”来创建一个新的应用程序。 3. 从Delphi的控件面板中选择一个TForm组件,并将其拖放到应用程序的设计窗口中。 4. 在设计窗口中,选择手写板的指令输入区域。这可以是一个编辑框或一个自定义的绘图区域,取决于您的需求。 5. 在Delphi中,可以使用一些组件库或第三方库来处理手写板的输入。例如,您可以使用Microsoft Ink组件、TVirtualhand等控件。 6. 根据您选择的组件,您可以在Delphi的事件处理程序中编写代码来获取手写板的指令。事件处理程序通常包括OnPenDown、OnPenUp、OnPenMove等事件,根据手写板的指令类型来响应。 7. 在事件处理程序中,您可以获得手写板的坐标、压力、速度和方向等信息,以及手写板的笔刷属性和笔迹类型等。 8. 根据您的需求,可以在事件处理程序中处理手写板的指令,例如将手写板的内容保存到文件、显示在应用程序的其他控件中或进行其他数据处理。 9. 在开发过程中,确保正确处理手写板的异常情况和错误功能,以提高应用程序的稳定性和用户体验。 以上是在Delphi中获取手写指令的简要步骤。具体的实现方式将根据您所选择的组件和需求进行细化和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值