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包括:管道 ...
随机推荐
- Django(ORM常用字段)
day68 参考:http://www.cnblogs.com/liwenzhou/p/8688919.html 1. Django ORM常用字段: 1. AutoField ...
- java.lang.System.setProperty()方法实例
java.lang.System.setProperty() 方法设置指定键指定的系统属性. 声明 以下是java.lang.System.setProperty()方法的声明 public stat ...
- 【hyperscan】编译hyperscan 4.0.0
ref: http://01org.github.io/hyperscan/dev-reference/getting_started.html 1. 硬件需求 intel x86处理器 64-bit ...
- cmd命令关闭占用程序的端口
遇到的问题: 在重新启动tomcat服务时,启动失败,显示的信息大概为:Error running 'cus_manager_system': Unable to open debugger port ...
- 【sping揭秘】6、IOC容器之统一资源加载策略
Spring中的resource 我们先看看类之间的关系 注意我们的application是间接继承了resourceloader的,也就是说我们的application其实就是一个resourcel ...
- oracle RAC 跨网段客户端访问 报ORA-12170
场景描述: 服务器所在网段为20,在同一网段的机器客户端远程连接SCAN IP 可以正常访问,当时更换了网段之后,15网段的机器通过oracle客户端连接服务器SCAN ip 无法正常访问,telne ...
- puppet的使用:ERB模板介绍
ERB介绍 全称是Embedded RuBy,意思是嵌入式的Ruby,是一种文本模板技术,用过JSP的话,会发现两者语法很像. 我们项目中一般用ERB来产生各模块的配置文件.ERB模板也可以用来产生W ...
- JavaScript -- Screen
-----041-Screen.html----- <!DOCTYPE html> <html> <head> <meta http-equiv=" ...
- 利用cygwin创建windows下的crontab定时任务
要求 必备知识 熟悉基本编程环境搭建. 运行环境 windows 7(64位); Cygwin-1.7.35 下载地址 环境下载 什么是Cygwin Cygwin是一个在windows平台上运行的类U ...
- 28-hadoop-hbase入门小程序
hbase的完全分布式建立起来了, 可以试下好使不 1, 导包, {HBASE_HOME}/lib 下所有的jar包, 导入 2, 使用junit测试, 会报错, 因为缺少一个jar 3, 获取链接, ...