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包括:管道 ...
随机推荐
- “全栈2019”Java多线程第三十四章:超时自动唤醒被等待的线程
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- Git-管理和撤销修改
一.管理修改 为什么说Git管理的是修改,而不是文件呢?我们还是做实验.第一步,对readme.txt做一个修改,比如加一行内容: Git is a distributed version contr ...
- javaweb项目中的过滤器的使用
翻阅博客园的的时候,看到两篇关于javaweb过滤器的帖子写的很好,这里备忘一下: 过滤器基础:http://www.cnblogs.com/xdp-gacl/p/3948353.html 获取器案例 ...
- SQL Server 用户'NT AUTHORITY\IUSR' 登录失败
今天打开网站时,突然报这个错误,平时都好好的 Cannot open database "JMECC" requested by the login. The login fail ...
- 使用反射功能在Unity运行状态通过Inspector面板修改字段和调用方法
使用反射功能在Unity运行状态通过Inspector面板修改字段和调用方法 效果展示 一个很简单的组件脚本 运行状态在Inspector面板可以随便修改字段和调用方法 方法调用日志 设计由来 最近在 ...
- [视频]K8飞刀 ms15022 office漏洞演示动画
[视频]K8飞刀 ms15022 office漏洞演示动画 https://pan.baidu.com/s/1eQnV8qQ
- POJ 2551
#include<iostream> #include<stdio.h> #include<string> using namespace std; //int m ...
- 剑指offer六之求旋转数组的最小数字
一.题目 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个 ...
- Java时间类(转)
package com.chinagas.common.utils; import java.text.ParseException; import java.text.SimpleDateForma ...
- CentOS 6.5 网络服务器功能的实现①:运用bind搭建基本的DNS服务器
何谓DNS服务?简而言之,DNS服务在互联网中可以实现域名解析(把域名转换成网络可以识别的IP地址). 名词解释①:正向解析:域名解析IP地址:反向解析:IP地址解析域名. DNS服务的正/反向区域解 ...