linux系统编程:read,write与lseek的综合应用
这个实例根据命令行参数进行相应的读学操作:
用法:
usage:./io file {r<length>|R<length>|w<string>|s<offset>}...
file参数:文件名, 如果不存在会自动创建
r<length>: 如r5, r: 读取操作,表示在当前文件指针后面读取5个字节的内容,以文本形式输出.
R<length>:如R5 R:读取操作,表示在当前文件指针后面读取5个字节的内容,以十六进制形式输出.
w<string>: 如wghostwu: w表示写入操作,表示在当前文件指针后面写入5个字节的内容
s<offset>: 如s1000, 从文件开头把指针移动1000个字节
源代码:
/*================================================================
* Copyright (C) 2018 . All rights reserved.
*
* 文件名称:io.c
* 创 建 者:ghostwu(吴华)
* 创建日期:2018年01月10日
* 描 述:write,open,lseek结合示例
*
================================================================*/ #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <limits.h>
#include <sys/types.h>
#include <unistd.h> //参数字符串转整数
int str_to_long( char* str ); int main(int argc, char *argv[])
{
int i = ;
int fd = -;
//保存字符串转整形的结果
int res;
//写入的字节数
ssize_t num;
//动态分配的堆内存
char* buf;
//读取的字节数
int numread; if( argc < || strcmp( argv[], "--help" ) == ) {
printf( "usage:%s file {r<length>|R<length>|w<string>|s<offset>}...\n", argv[] );
exit( - );
} fd = open( argv[], O_RDWR | O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH );
if( fd < ) {
printf( "文件%s打开或者创建失败", argv[] );
exit( - );
} for( i = ; i < argc; i++ ){
switch( argv[i][] ){
//移动指针, s后面跟移动的字节数
case 's':
res = str_to_long( &argv[i][] );
if( - == res ) {
printf( "字符串->整形转换失败\n" );
exit( - );
}
lseek( fd, res, SEEK_CUR );
printf( "%s--->指针移动成功\n", argv[i] );
break;
//写入文件, w后面跟写入的内容
case 'w':
num = write( fd, &argv[i][], strlen( &argv[i][] ) );
if( num == - ) {
printf( "%s写入失败\n", argv[i] );
}
printf( "%s成功写入%ld个字节\n", argv[i], num );
break;
case 'r': //字符输出
case 'R': //十六进制输出
res = str_to_long( &argv[i][] );
if( - == res ) {
printf( "字符串->整形转换失败\n" );
exit( - );
}
buf = malloc( res );
if( buf == NULL ){
printf( "内存分配失败" );
exit( - );
}
numread = read( fd, buf, res );
if( - == numread ) {
printf( "数据读取失败\n" );
exit( - );
}
if( == numread ) {
printf( "已经到达文件尾部" );
}else {
printf( "%s: ", argv[i] );
for ( int j = ; j < numread; j ++ ){
if( 'r' == argv[i][] ) {
printf( "%c", buf[j] );
}else {
printf( "%02x ", buf[j] );
}
}
}
break;
default:
printf( "参数%s必须以[rRws]中的一个开头\n", argv[i] );
}
} return ;
} int str_to_long( char* str ) {
char* endstr;
int res;
res = strtol( str, &endstr, );
if( (res == LONG_MIN) || (res == LONG_MAX) ) {
return -;
}
return res;
}
完整的演示效果:
ghostwu@ubuntu:~/c_program/tlpi/chapter4$ ls
cp cp.c cp.c.copy io io.c strtol strtol.c
ghostwu@ubuntu:~/c_program/tlpi/chapter4$ !g
gcc io.c -o io
ghostwu@ubuntu:~/c_program/tlpi/chapter4$ ls -l
total
-rwxrwxr-x ghostwu ghostwu 1月 : cp
-rw-rw-r-- ghostwu ghostwu 1月 : cp.c
-rw-rw-r-- ghostwu ghostwu 1月 : cp.c.copy
-rwxrwxr-x ghostwu ghostwu 1月 : io
-rw-rw-r-- ghostwu ghostwu 1月 : io.c
-rwxrwxr-x ghostwu ghostwu 1月 : strtol
-rw-rw-r-- ghostwu ghostwu 1月 : strtol.c
ghostwu@ubuntu:~/c_program/tlpi/chapter4$ ./io test.txt
usage:./io file {r<length>|R<length>|w<string>|s<offset>}...
ghostwu@ubuntu:~/c_program/tlpi/chapter4$ ls -l
total
-rwxrwxr-x ghostwu ghostwu 1月 : cp
-rw-rw-r-- ghostwu ghostwu 1月 : cp.c
-rw-rw-r-- ghostwu ghostwu 1月 : cp.c.copy
-rwxrwxr-x ghostwu ghostwu 1月 : io
-rw-rw-r-- ghostwu ghostwu 1月 : io.c
-rwxrwxr-x ghostwu ghostwu 1月 : strtol
-rw-rw-r-- ghostwu ghostwu 1月 : strtol.c
ghostwu@ubuntu:~/c_program/tlpi/chapter4$ ./io test.txt s1000 wghostwu
s1000--->指针移动成功
wghostwu成功写入7个字节
ghostwu@ubuntu:~/c_program/tlpi/chapter4$ ls -l
total
-rwxrwxr-x ghostwu ghostwu 1月 : cp
-rw-rw-r-- ghostwu ghostwu 1月 : cp.c
-rw-rw-r-- ghostwu ghostwu 1月 : cp.c.copy
-rwxrwxr-x ghostwu ghostwu 1月 : io
-rw-rw-r-- ghostwu ghostwu 1月 : io.c
-rwxrwxr-x ghostwu ghostwu 1月 : strtol
-rw-rw-r-- ghostwu ghostwu 1月 : strtol.c
-rw-rw-r-- ghostwu ghostwu 1月 : test.txt
ghostwu@ubuntu:~/c_program/tlpi/chapter4$ ./io test.txt r1007
r1007: ghostwughostwu@ubuntu:~/c_program/tlpi/chapter4$ ./io test.txt R1007
R1007: 6f
41 ghostwu@ubuntu:~/c_program/tlpi/chapter4$ ./io test.txt s1000 r7
s1000--->指针移动成功
r7: ghostwughostwu@ubuntu:~/c_program/tlpi/chapter4$ ./io test.txt s1000 R7
s1000--->指针移动成功
linux系统编程:read,write与lseek的综合应用的更多相关文章
- linux系统编程之管道(三)
今天继续研究管道的内容,这次主要是研究一下命名管道,以及与之前学过的匿名管道的区别,话不多说,进入正题: 所以说,我们要知道命名管道的作用,可以进行毫无关系的两个进程间进行通讯,这是匿名管道所无法实现 ...
- Linux系统编程@进程通信(一)
进程间通信概述 需要进程通信的原因: 数据传输 资源共享 通知事件 进程控制 Linux进程间通信(IPC)发展由来 Unix进程间通信 基于System V进程间通信(System V:UNIX系统 ...
- Linux 系统编程
简介和主要概念 Linux 系统编程最突出的特点是要求系统程序员对它们工作的的系统的硬件和操作系统有深入和全面的了解,当然它们还有库和系统调用上的区别. 系统编程分为:驱动编程.用户空间编程和网络编程 ...
- Linux C 程序 文件操作(Linux系统编程)(14)
文件操作(Linux系统编程) 创建一个目录时,系统会自动创建两个目录.和.. C语言实现权限控制函数 #include<stdio.h> #include<stdlib.h> ...
- 读书笔记之Linux系统编程与深入理解Linux内核
前言 本人再看深入理解Linux内核的时候发现比较难懂,看了Linux系统编程一说后,觉得Linux系统编程还是简单易懂些,并且两本书都是讲Linux比较底层的东西,只不过侧重点不同,本文就以Linu ...
- Linux系统编程【转】
转自:https://blog.csdn.net/majiakun1/article/details/8558308 一.Linux系统编程概论 1.1 系统编程基石 syscall: libc:标准 ...
- 《Linux系统编程(第2版)》
<Linux系统编程(第2版)> 基本信息 作者: (美)Robert Love 译者: 祝洪凯 李妹芳 付途 出版社:人民邮电出版社 ISBN:9787115346353 上架时间:20 ...
- linux系统编程(一)概述
glibc库封装了linux系统调用,并提供c语言接口 所以学习linux系统编程,主要参考glibc库系统调用相关api 一.进程控制: fork 创建一个新进程 clone 按指定条件创建子进程 ...
- Linux 系统编程 学习:02-进程间通信1:Unix IPC(1)管道
Linux 系统编程 学习:02-进程间通信1:Unix IPC(1)管道 背景 上一讲我们介绍了创建子进程的方式.我们都知道,创建子进程是为了与父进程协作(或者是为了执行新的程序,参考 Linux ...
- Linux 系统编程 学习:03-进程间通信1:Unix IPC(2)信号
Linux 系统编程 学习:03-进程间通信1:Unix IPC(2)信号 背景 上一讲我们介绍了Unix IPC中的2种管道. 回顾一下上一讲的介绍,IPC的方式通常有: Unix IPC包括:管道 ...
随机推荐
- Linux查看运行时间
以下命令都可以查看出系统运行时间.对于查看机器的状态很有帮助. w -b 查看最后一次系统启动的时间 w -r 查看当前系统运行时间 last reboot 查看系统历史启动的时间 top up后表示 ...
- 【文文殿下】[APIO2010]特别行动队 题解
基本上是一个斜率优化裸题了 #include<bits/stdc++.h> using namespace std; typedef long long ll; const int max ...
- spark踩坑——dataframe写入hbase连接异常
最近测试环境基于shc[https://github.com/hortonworks-spark/shc]的hbase-connector总是异常连接不到zookeeper,看下报错日志: 18/06 ...
- Liferay7 BPM门户开发之1:Liferay7开发环境准备
liferay sdk下载 \IDE下载 \ Tomcat 安装细节不在此赘述 网上有很多. 只讲核心关键坑点 进入2016年,从Liferay6.2.5 ga6版本开始,到7.0 ga3,在ivy环 ...
- centos docker 安装笔记
安装epel rpm -ivh http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm rpm --import ...
- Hbuilder用ajax连接阿里服务器上的servlet以及注意事项
Hbuiler连接服务器上的servlet的步骤与连接本地项目中的servlet基本一致,详细内容参考上一片博客:https://www.cnblogs.com/ljysy/p/10294640.ht ...
- 重启tomcat服务操作
1. 进入linux系统下tomcat的bin目录,比如:cd /usr/local/apache-tomcat-7.0.42/bin 2. 关闭一下tomcat服务,特别是已经启动的情况下,只不过有 ...
- Delphi:程序自己删除自己,适用于任何windows版本(含源码)
Delphi:程序自己删除自己,适用于任何windows版本(含源码) function Suicide: Boolean; var sei: TSHELLEXECUTEINFO; szMod ...
- 课程一(Neural Networks and Deep Learning),第三周(Shallow neural networks)—— 2、Practice Questions
1.以下哪一项是正确的?(检查所有适用的) (A,D,F,G) A. a[2] 表示第二层的激活函数值向量. B. X 是一个矩阵, 其中每一行都是一个训练示例. C. a[2] (12) 表示第二 ...
- Java抽象类应用—模板方法模式
模板方法模式(Templete method) 定义一个操作中的算法的骨架,而将一些可变部分的实现延迟到子类中,模板方法模式使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定的步骤. 例: ...