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系统VIM编辑器管理(2)
VI/VIM模式概述 在 Linux 的世界中,绝大部分的配置文件都是以 ASCII 的纯文本形态存在,因此利用简单的文字编辑软件就能够修改设定了,与微软的 Windows 系统不同的是,如果你用惯了 ...
- 《Python自动化运维之路》 业务服务监控(二)
文件内容差异对比方法 使用diffie模块实现文件内容差异对比.dmib作为 Python的标准库模块,无需安装,作用是对比文本之间的差异,且支持输出可读性比较强的HTML文档,与 Linux下的di ...
- 使用solr crud 的三种方式(了该)
1.solrJ 实际是http 请/响 2.spring data solr 实际是对官方类库(solrJ)的封装 3.使用httpClient 手动请求
- 输入URL地址到最终页面渲染完成,发生了什么事
1. 域名DNS解析 - 浏览器DNS缓存 - 系统DNS缓存 - 路由器DNS缓存 - 网络运营商DNS缓存 - 递归搜索...... 2. TCP连接: TCP三次握手 - 第一次握手,由浏览器发 ...
- Spring static 静态属性注入
<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> &l ...
- web socket 入门
WebSocket是HTML5开始提供的一种在单个 TCP 连接上进行全双工通讯的协议,其优雅地解决了以往web服务器不能向web客户端实时推送消息的问题. 在浏览器js环境中,创建一个websock ...
- python 跨平台获取网卡信息和本机ip地址
笔者在项目中遇到过获取本机网卡ip的例子,利用python库psutil解决了此问题. def get_netcard(): """获取网卡名称和ip地址 "& ...
- [Leetcode]315.计算右侧小于当前元素的个数 (6种方法)
链接 给定一个整数数组 nums,按要求返回一个新数组 counts.数组 counts 有该性质: counts[i] 的值是 nums[i] 右侧小于 nums[i] 的元素的数量. 示例: 输 ...
- vue教程3-03 vue组件,定义全局、局部组件,配合模板,动态组件
vue教程3-03 vue组件,定义全局.局部组件,配合模板,动态组件 一.定义一个组件 定义一个组件: 1. 全局组件 var Aaa=Vue.extend({ template:'<h3&g ...
- Spark程序提交到Yarn集群时所遇异常
Exception 1:当我们将任务提交给Spark Yarn集群时,大多会出现以下异常,如下: 14/08/09 11:45:32 WARN component.AbstractLifeCycle: ...