使用C语言简单模拟Linux的cat程序
先给出源码
//fileio.c
#include<stdio.h>
#include<stdlib.h>
#include<fcntl.h>
void print(int fd)
{
int i,len;
char buf[10];
len=read(fd,buf,10);//len是成功读入的字节数,每read一次,文件偏移量就会偏移10个字节位置
while(len>0)//循环打印,直至读到文件尾部了
{
for(i=0;i<len;i++)
{
printf("%c",buf[i]);
}
len=read(fd,buf,10);
}
}
void prin()
{
char buf[1024];//我对指针还不熟,不过换成指针应该会好点吧
while(1)//死循环打印字符串
{
scanf("%s",buf);
puts(buf);
}
}
int main(int argc,char *argv[])//argc参数个数,注意为1时代表没有参数(只有程序名字),argv[]是指参数,argv[1]指第一个参数,argv[2]指第二个参数。。。
{
int fd,i;
if(argc==1)//没有参数,跳到prin函数,
{
prin();
return 0;
}
for(i=1;i<=argc-1;i++)//因为argc为2时才表示有一个参数啊
{
fd=open(argv[i],O_RDWR);//以可写可读方式打开
if(fd==-1)//打开失败
{
perror("Error");//显示错误信息
}
else
{
print(fd);//打开成功跳转print函数
}
close(fd);//记得打开之后关闭文件描述符
}
return 0;
}
下面给演示一下我的运行结果
[root@bogon mycode]# gcc fileio.c
[root@bogon mycode]# ./a.out
linux
linux
ok
ok
^C
[root@bogon mycode]# ./a.out test.txt
ok
that is fine
linux
[root@bogon mycode]# ./a.out test.txt fileio.c
ok
that is fine
linux
#include<stdio.h>
#include<stdlib.h>
#include<fcntl.h>
void print(int fd)
{
int i,len;
char buf[10];
len=read(fd,buf,10);
while(len>0)
{
for(i=0;i<len;i++)
{
printf("%c",buf[i]);
}
len=read(fd,buf,10);
}
}
void prin()
{
char buf[1024];
while(1)
{
scanf("%s",buf);
puts(buf);
}
}
int main(int argc,char *argv[])
{
int fd,i;
if(argc==1)
{
prin();
return 0;
}
for(i=1;i<=argc-1;i++)
{
fd=open(argv[i],O_RDWR);
if(fd==-1)
{
perror("Error");
//continue;
}
else
{
print(fd);
}
close(fd);
}
return 0;
}
[root@bogon mycode]# ./a.out nothisfile.txt test.txt
Error: No such file or directory
ok
that is fine
linux
[root@bogon mycode]#
这个小程序免不了有bug,大神们发现了的话可以留言交流一下,谢谢
使用C语言简单模拟Linux的cat程序的更多相关文章
- 通过简单的Linux内核启动程序代码窥探操作系统的启动原理
作者:吴乐 山东师范大学 <Linux内核分析> 孟宁 MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.程序设计与分析 ...
- Linux 内核 链表 的简单模拟(1)
第零章:扯扯淡 出一个有意思的题目:用一个宏定义FIND求一个结构体struct里某个变量相对struc的编移量,如 struct student { int a; //FIND(struct stu ...
- Linux 内核 链表 的简单模拟(2)
接上一篇Linux 内核 链表 的简单模拟(1) 第五章:Linux内核链表的遍历 /** * list_for_each - iterate over a list * @pos: the & ...
- Linux内核分析第三周学习总结:构造一个简单的Linux系统MenuOS
韩玉琪 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.Linux内 ...
- 以Qemu模拟Linux,学习Linux内核
文章名称:以Qemu模拟Linux,学习Linux内核作 者:five_cent文章地址:http://www.cnblogs.com/senix/archive/2013/02/21/29 ...
- 运用Python语言编写获取Linux基本系统信息(二):文件系统使用情况获取
本文跟着上一篇文章继续写,上一篇文章的链接 运用Python语言编写获取Linux基本系统信息(一):获得Linux版本.内核.当前时间 一.随便说说 获取文件系统使用情况的思路和上一篇获取主要系统是 ...
- Linux下简单的取点阵字模程序
源:Linux下简单的取点阵字模程序 Linux操作系统下进行简单的图形开发,经常会用到取字模的软件,但是Linux并没有像Windows下的小工具可用,我们也并不希望为了取字模而频繁地切换操作系统. ...
- Linux内核分析— —构造一个简单的Linux系统MenuOS(20135213林涵锦)
Linux内核分析— —构造一个简单的Linux系统MenuOS 实验内容 Linux内核的启动过程,从start_kernel到init进程启动 使用实验楼的虚拟机打开shell cd LinuxK ...
- python--selenium简单模拟百度搜索点击器
python--selenium简单模拟百度搜索点击器 发布时间:2018-02-28 来源:网络 上传者:用户 关键字: selenium 模拟 简单 点击 搜索 百度 发表文章摘要:用途:简单模拟 ...
随机推荐
- CPU使用率过高分析方法
项目过程中发现,应用服务器经常会出现CPU使用率较高的情况,需要定位出具体代码问题. 1.用top命令,根据CPU使用率排序,找出消耗cpu最高的进程 2.找出该进程下消耗CPU最高的线程(命令:to ...
- 循环神经网络-RNN进阶
这部分许多内容要类比CNN来进行理解和解释,所以需要对CNN比较熟悉. RNN的特点 1. 权值共享 CNN权值共享,RNN也有权值共享,在入门篇可以看到RNN结构图中,权重使用的是同样的字母 为什么 ...
- TransactionScop事务机制的使用
如果在C#中使用TransactionScope类(分布式事务),则须注意如下事项:1.在项目中引用using System.Transactions命名空间(先要在添加net组件的引用); 2.具体 ...
- python学习 day01 基础介绍
一.编程的目的 1.什么是语言?编程语言又为何? 语言是一种事物与另外一种事物沟通的介质.编程语言是程序员和计算机沟通的介质. 2.什么是编程? 程序员把自己想要计算机做的事用编程语言表达出来,编程的 ...
- Android:如何获取屏幕的宽高
WindowManager wm = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE); DisplayMet ...
- python-django的生命周期
wsgi,请求封装后交给web框架(flask,django) 中间件,对请求进行校验或在请求对象中添加其他相关数据,列如(scrf[跨域],request,session) 路由匹配,根据浏览器发送 ...
- nodejs环境下配置运行mysql
首先需要在本地运行node环境 必须在本地安装mysql(可以用xampp里面的) 在node环境下引入mysql模块 命令: npm install node-mysql 运用例子(前提条件 ...
- 记第十四届省赛参赛体会&第十三届
emmm....时间还是很久远了 还是流水账 这次比赛我还是挺开心的 因为感觉我们余神就是一把宝剑,然后我是她的Buff 前面四道题就挺顺利都1A过了,十年余神就是强无敌呀 最后两分钟过了第五题,银牌 ...
- 【Python】xml遍历练习
<?xml version="1.0" encoding="utf-8" ?> <!--this is a test about xml. ...
- SAP Module Pool Program Learning Documentation——Commit Work and Update dtab
When using Native SQL to directly manipulate database tables, it makes a difference to use COMMIT WO ...