linux系统编程:read,write与lseek的综合应用
2023-09-11 14:19:51 时间
这个实例根据命令行参数进行相应的读学操作:
用法:
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个字节
源代码:
1 /*================================================================ 2 * Copyright (C) 2018 . All rights reserved. 3 * 4 * 文件名称:io.c 5 * 创 建 者:ghostwu(吴华) 6 * 创建日期:2018年01月10日 7 * 描 述:write,open,lseek结合示例 8 * 9 ================================================================*/ 10 11 #include <stdio.h> 12 #include <stdlib.h> 13 #include <string.h> 14 #include <sys/types.h> 15 #include <sys/stat.h> 16 #include <fcntl.h> 17 #include <limits.h> 18 #include <sys/types.h> 19 #include <unistd.h> 20 21 //参数字符串转整数 22 int str_to_long( char* str ); 23 24 int main(int argc, char *argv[]) 25 { 26 int i = 2; 27 int fd = -1; 28 //保存字符串转整形的结果 29 int res; 30 //写入的字节数 31 ssize_t num; 32 //动态分配的堆内存 33 char* buf; 34 //读取的字节数 35 int numread; 36 37 if( argc < 3 || strcmp( argv[1], "--help" ) == 0 ) { 38 printf( "usage:%s file {r<length>|R<length>|w<string>|s<offset>}...\n", argv[0] ); 39 exit( -1 ); 40 } 41 42 fd = open( argv[1], O_RDWR | O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH ); 43 if( fd < 0 ) { 44 printf( "文件%s打开或者创建失败", argv[1] ); 45 exit( -1 ); 46 } 47 48 for( i = 2; i < argc; i++ ){ 49 switch( argv[i][0] ){ 50 //移动指针, s后面跟移动的字节数 51 case 's': 52 res = str_to_long( &argv[i][1] ); 53 if( -1 == res ) { 54 printf( "字符串->整形转换失败\n" ); 55 exit( -1 ); 56 } 57 lseek( fd, res, SEEK_CUR ); 58 printf( "%s--->指针移动成功\n", argv[i] ); 59 break; 60 //写入文件, w后面跟写入的内容 61 case 'w': 62 num = write( fd, &argv[i][1], strlen( &argv[i][1] ) ); 63 if( num == -1 ) { 64 printf( "%s写入失败\n", argv[i] ); 65 } 66 printf( "%s成功写入%ld个字节\n", argv[i], num ); 67 break; 68 case 'r': //字符输出 69 case 'R': //十六进制输出 70 res = str_to_long( &argv[i][1] ); 71 if( -1 == res ) { 72 printf( "字符串->整形转换失败\n" ); 73 exit( -1 ); 74 } 75 buf = malloc( res ); 76 if( buf == NULL ){ 77 printf( "内存分配失败" ); 78 exit( -1 ); 79 } 80 numread = read( fd, buf, res ); 81 if( -1 == numread ) { 82 printf( "数据读取失败\n" ); 83 exit( -1 ); 84 } 85 if( 0 == numread ) { 86 printf( "已经到达文件尾部" ); 87 }else { 88 printf( "%s: ", argv[i] ); 89 for ( int j = 0 ; j < numread; j ++ ){ 90 if( 'r' == argv[i][0] ) { 91 printf( "%c", buf[j] ); 92 }else { 93 printf( "%02x ", buf[j] ); 94 } 95 } 96 } 97 break; 98 default: 99 printf( "参数%s必须以[rRws]中的一个开头\n", argv[i] ); 100 } 101 } 102 103 return 0; 104 } 105 106 int str_to_long( char* str ) { 107 char* endstr; 108 int res; 109 res = strtol( str, &endstr, 10 ); 110 if( (res == LONG_MIN) || (res == LONG_MAX) ) { 111 return -1; 112 } 113 return res; 114 }
完整的演示效果:
1 ghostwu@ubuntu:~/c_program/tlpi/chapter4$ ls 2 cp cp.c cp.c.copy io io.c strtol strtol.c 3 ghostwu@ubuntu:~/c_program/tlpi/chapter4$ !g 4 gcc io.c -o io 5 ghostwu@ubuntu:~/c_program/tlpi/chapter4$ ls -l 6 total 56 7 -rwxrwxr-x 1 ghostwu ghostwu 9016 1月 10 17:16 cp 8 -rw-rw-r-- 1 ghostwu ghostwu 1752 1月 10 17:15 cp.c 9 -rw-rw-r-- 1 ghostwu ghostwu 1752 1月 10 17:16 cp.c.copy 10 -rwxrwxr-x 1 ghostwu ghostwu 13360 1月 10 22:19 io 11 -rw-rw-r-- 1 ghostwu ghostwu 2743 1月 10 22:19 io.c 12 -rwxrwxr-x 1 ghostwu ghostwu 8824 1月 10 20:47 strtol 13 -rw-rw-r-- 1 ghostwu ghostwu 616 1月 10 20:47 strtol.c 14 ghostwu@ubuntu:~/c_program/tlpi/chapter4$ ./io test.txt 15 usage:./io file {r<length>|R<length>|w<string>|s<offset>}... 16 ghostwu@ubuntu:~/c_program/tlpi/chapter4$ ls -l 17 total 56 18 -rwxrwxr-x 1 ghostwu ghostwu 9016 1月 10 17:16 cp 19 -rw-rw-r-- 1 ghostwu ghostwu 1752 1月 10 17:15 cp.c 20 -rw-rw-r-- 1 ghostwu ghostwu 1752 1月 10 17:16 cp.c.copy 21 -rwxrwxr-x 1 ghostwu ghostwu 13360 1月 10 22:19 io 22 -rw-rw-r-- 1 ghostwu ghostwu 2743 1月 10 22:19 io.c 23 -rwxrwxr-x 1 ghostwu ghostwu 8824 1月 10 20:47 strtol 24 -rw-rw-r-- 1 ghostwu ghostwu 616 1月 10 20:47 strtol.c 25 ghostwu@ubuntu:~/c_program/tlpi/chapter4$ ./io test.txt s1000 wghostwu 26 s1000--->指针移动成功 27 wghostwu成功写入7个字节 28 ghostwu@ubuntu:~/c_program/tlpi/chapter4$ ls -l 29 total 60 30 -rwxrwxr-x 1 ghostwu ghostwu 9016 1月 10 17:16 cp 31 -rw-rw-r-- 1 ghostwu ghostwu 1752 1月 10 17:15 cp.c 32 -rw-rw-r-- 1 ghostwu ghostwu 1752 1月 10 17:16 cp.c.copy 33 -rwxrwxr-x 1 ghostwu ghostwu 13360 1月 10 22:19 io 34 -rw-rw-r-- 1 ghostwu ghostwu 2743 1月 10 22:19 io.c 35 -rwxrwxr-x 1 ghostwu ghostwu 8824 1月 10 20:47 strtol 36 -rw-rw-r-- 1 ghostwu ghostwu 616 1月 10 20:47 strtol.c 37 -rw-rw-r-- 1 ghostwu ghostwu 1007 1月 10 22:20 test.txt 38 ghostwu@ubuntu:~/c_program/tlpi/chapter4$ ./io test.txt r1007 39 r1007: ghostwughostwu@ubuntu:~/c_program/tlpi/chapter4$ ./io test.txt R1007 40 R1007: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 67 68 6f 73 74 77 75
41 ghostwu@ubuntu:~/c_program/tlpi/chapter4$ ./io test.txt s1000 r7 42 s1000--->指针移动成功 43 r7: ghostwughostwu@ubuntu:~/c_program/tlpi/chapter4$ ./io test.txt s1000 R7 44 s1000--->指针移动成功
相关文章
- Linux 性能调优内存篇:工具命令篇
- Linux文件(区域)锁函数 -- open()、fcntl()
- 【Linux】Linux 的高速缓存
- 【Linux】在linux上java工具jps jstat jinfo等命令找不到怎么办
- 每天一个linux命令(23):Linux 目录结构
- Linux下如何查看哪个进程占用内存多?
- 【学习总结】快速上手Linux玩转典型应用-第6章-linux常用命令讲解
- 【学习总结】快速上手Linux玩转典型应用-目录
- linux sudo 命令
- linux下安装apache(httpd-2.4.3版本)各种坑
- Linux中使用SecureCRT上传、下载文件命令sz与rz用法实例
- 【Android 逆向】Android 系统文件分析 ( /system/ 系统命令和系统应用数据目录 | /system/app/ 系统应用目录 | sys Linux 系统内核文件目录 )
- Linux下如何安装Anaconda?
- L86.linux命令每日一练 -- 第12章 Linux系统常用内置命令(二)
- L72.linux命令每日一练 -- 第十章 Linux网络管理命令 -- mail和nslookup
- L62.linux命令每日一练 -- 第九章 Linux进程管理命令 -- strace和ltrace
- L48.linux命令每日一练 -- 第七章 Linux用户管理及用户信息查询命令 -- last、lastb和lastlog
- L34.linux命令每日一练 -- 第五章 Linux信息显示与搜索文件命令 -- echo和watch
- 74:应急响应-win&linux分析后门&勒索病毒&攻击 ==》暴力破解攻击成功的在4624的eventID里!PChunter可查看非系统的可疑启动项/服务/定时任务,还是很直观的!Linux下gscan也不错,EDR可参考。
- linux通配符
- 在Linux安装配置Tomcat 并部署web应用 ( 三种方式 )
- 周立功arm linux教程,极速搭建周立功IMX287A ARM Linux开发环境
- Linux【实操篇】—— 用户管理、linux系统root密码找回方式
- ZYNQ - 嵌入式Linux开发 -08- linux应用程序开发
- Linux服务器收到SYN请求包没有回应ACK导致客户端无法建立TCP连接(文中的文章是转载的)