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包括:管道 ...
随机推荐
- WebRTC开发基础(WebRTC入门系列1:getUserMedia)
什么是WebRTC WebRTC由IETF(Internet Engineering Task Force——互联网工程任务组)和W3C(World Wide Web Consortium——万维网联 ...
- 在matlab中实现PCA算法
function [V,S,E]=princa(X) [m,n]=size(X); %计算矩阵的行m和列n %-------------第一步:标准化矩阵-----------------% mv=m ...
- (转)学会数据库读写分离、分表分库——用Mycat,这一篇就够了!
原文:https://www.cnblogs.com/joylee/p/7513038.html 系统开发中,数据库是非常重要的一个点.除了程序的本身的优化,如:SQL语句优化.代码优化,数据库的处理 ...
- const和define的差别
1.const有什么用途?(1)可以定义const常量(2)const可以修饰函数的参数和返回值,甚至函数的定义体.被const修饰的东西都受到强制保护,可以预防以外的变动,能提高程序的健壮性. in ...
- Elasticsearch5.3.1 IK分词,同义词/联想搜索设置
[大数据]-Elasticsearch5.3.1 IK分词,同义词/联想搜索设置 原文地址:http://www.cnblogs.com/NextNight/p/6837407.html --题外话 ...
- keepalived双机热备,安装部署文档
keepalived双击热备,安装部署文档: 下载目录:/apps/keepalived-1.2.7.tar.gz 1:---> yum install -y make wget 2:---&g ...
- WTF小程序之<web-view>
叨叨两句 昨天爬了一下午坑才出来的我向大家问好
- wordpress添加文章阅读数量
将下面代码添加到functions.php //取得文章的阅读次数 function post_views($before = '点击 ', $after = ' 次', $echo = 1) { g ...
- Spring Security和JWT实现登录授权认证
目标 1.Token鉴权 2.Restful API 3.Spring Security+JWT 开始 自行新建Spring Boot工程 引入相关依赖 <dependency> < ...
- php使用 utf8_encode 来将特殊字符转成 utf8
如果在接受 $_POST 或 $_GET 时发生类似的错误报告:SQLSTATE[HY000]: General error: 1366 Incorrect string value: '\xF6te ...