Linux下C编程-----文件操作(1) 通过系统调用简单操作标准输入、标准输出、标准错误

简介: Linux的 C系统调用操作  ,下面我们就来练习下 简单的系统调用操作 read系统调用测试 /************************************************************************* > File Name: read.

Linux的 C系统调用操作  ,下面我们就来练习下 简单的系统调用操作

read系统调用测试

/*************************************************************************
	> File Name: read.c
	> Author: 
	> Mail: 
	> Created Time: Tue 10 Feb 2015 01:23:58 AM PST
 ************************************************************************/

#include<stdio.h>
#include<unistd.h>
#include<errno.h>
//利用管道测试程序的标准输入
//echo  hello world | ./read
// ./read < a.txt 
int main()
{
    char buf[128] ;
    int len ;
    //从输入流读取数据进入到buffer 如果返回-1 那么说明读取错误
    if((len=read(0,buf,128))==-1)
    { 
        //错误写入标准错误输出 
        write(2,"read error\n",11) ;
    }
    //将通过标准输入读取的数据通过标准输出输出到控制台 
    if(write(1,buf,len)!=len)
    {   
        //如果输出的长度不等于 len 说明 IO错误 
        write(2,"read error\n",11) ;
    }
    exit(0);
    return 0 ;
}
  


write系统调用测试

/*************************************************************************
	> File Name: write.c
	> Author: 
	> Mail: 
	> Created Time: Tue 10 Feb 2015 12:39:05 AM PST
 ************************************************************************/

#include<stdio.h>
//Linux和 Uninx有关与系统调用的封装
#include<unistd.h>
//errno系统最后一次错误
#include<errno.h>
//通过自动打开文件句柄 1  也就是标准输出进行字符串输出 
int main()
{ 
    if(write(1,"hello,world\n",2)!=12)
    {
        write(2,"write error!\n",13) ;
    }
   printf("ErrorNo:%d\n",errno);
   exit(0) ;
}

open系统调用测试1

/*************************************************************************
	> File Name: open.c
	> Author: 
	> Mail: 
	> Created Time: Tue 10 Feb 2015 02:07:54 AM PST
 ************************************************************************/

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <stdlib.h> 
int main()
{
    char*filein="./in.txt" ;
    char*fileout="./out.txt" ;
    int fdin,fdout ;
    char rdChar ; 
    //以只读方式打开输入文件 
    if((fdin=open(filein,O_RDONLY))==-1)
    {   
        write(2,"OpenError!\n",11)  ;
        return 0 ;
    }
    //打开文件 文件不存在并且创建文件文件存在 会 清空文件  并且复给 文件所有者读写权限 
    if((fdout=open(fileout,O_CREAT|O_WRONLY|O_TRUNC,S_IRUSR|S_IWUSR))==-1)
    {  
        //error
        write(2,"OpenError!\n",11);
        return 0 ;
    }
    //通过系统调用进行文件复制
    while(read(fdin,&rdChar,1)==1)
    {
        write(fdout,&rdChar,1) ;
    }exit(0)
    return  0 ;
}

open系统调用测试2

#include<stdio.h>
#include<unistd.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<sys/types.h>
int main()
{
    int fdin,fdout,len ;
    char buf[10] ;
    fdin=open("./in.txt",O_RDONLY); 
    fdout=open("./out.out",O_WRONLY|O_TRUNC|O_CREAT,S_IRUSR|S_IWUSR) ; 
    //效率比较高的写法  尽量少调用系统调用
    while((len=read(fdin,buf,10))>0)
    {
        write(fdout,buf,len) ;
    }
    return 0 ;

lseek系统调用测试

/*************************************************************************
	> File Name: lseek.c
	> Author: 
	> Mail: 
	> Created Time: Tue 10 Feb 2015 05:02:51 AM PST
 ************************************************************************/

#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<fcntl.h>
#include<sys/stat.h> 
#define STD_INPUT 0
#define STD_OUTPUT 1
#define STD_ERROR 2
//函数读取用户输出的第二个和倒数第二个字符 输入字符串大于5
int main()
{  
    char input[256] ;
    int rdLen,wLen ;
    int fdwrite,fdread;
    char rdChar;
    rdLen=read(STD_INPUT,input,256);
    if(rdLen==-1)
    {
        write(STD_ERROR,"error\n",6);
        exit(0);
    }
    if((fdwrite=open("./res.txt",O_CREAT|O_TRUNC|O_WRONLY,S_IRUSR|S_IWUSR))==-1)
    {
        write(STD_ERROR,"create file error",17);
        exit(0) ;
    }
    wLen=write(fdwrite,input,rdLen); 
    if(wLen==-1)
       exit(0);
    close(fdwrite) ;
    if((fdread=open("./res.txt",O_RDONLY))==-1)
       exit(0);
    lseek(fdread,1,SEEK_SET);
    read(fdread,&rdChar,1) ;
    printf("Index2:%c\n",rdChar);
    lseek(fdread,-3,SEEK_END) ;
    read(fdread,&rdChar,1);
    printf("Index-2:%c\n",rdChar);
    close(fdread) ;
    return 0 ;
}


目录
相关文章
|
9天前
|
Linux
Linux编程: 在业务线程中注册和处理Linux信号
通过本文,您可以了解如何在业务线程中注册和处理Linux信号。正确处理信号可以提高程序的健壮性和稳定性。希望这些内容能帮助您更好地理解和应用Linux信号处理机制。
47 26
|
5月前
|
Shell Linux
Linux shell编程学习笔记30:打造彩色的选项菜单
Linux shell编程学习笔记30:打造彩色的选项菜单
|
2月前
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
118 13
|
3月前
|
运维 监控 网络协议
运维工程师日常工作中最常用的20个Linux命令,涵盖文件操作、目录管理、权限设置、系统监控等方面
本文介绍了运维工程师日常工作中最常用的20个Linux命令,涵盖文件操作、目录管理、权限设置、系统监控等方面,旨在帮助读者提高工作效率。从基本的文件查看与编辑,到高级的网络配置与安全管理,这些命令是运维工作中的必备工具。
269 3
|
3月前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。
|
4月前
|
网络协议 Linux 调度
深入探索Linux操作系统的心脏:内核与系统调用####
本文旨在揭开Linux操作系统中最为核心的部分——内核与系统调用的神秘面纱,通过生动形象的语言和比喻,让读者仿佛踏上了一段奇妙的旅程,从宏观到微观,逐步深入了解这两个关键组件如何协同工作,支撑起整个操作系统的运行。不同于传统的技术解析,本文将以故事化的方式,带领读者领略Linux内核的精妙设计与系统调用的魅力所在,即便是对技术细节不甚了解的读者也能轻松享受这次知识之旅。 ####
|
4月前
|
缓存 算法 安全
深入理解Linux操作系统的心脏:内核与系统调用####
【10月更文挑战第20天】 本文将带你探索Linux操作系统的核心——其强大的内核和高效的系统调用机制。通过深入浅出的解释,我们将揭示这些技术是如何协同工作以支撑起整个系统的运行,同时也会触及一些常见的误解和背后的哲学思想。无论你是开发者、系统管理员还是普通用户,了解这些基础知识都将有助于你更好地利用Linux的强大功能。 ####
63 1
|
5月前
|
Shell Linux
Linux shell编程学习笔记82:w命令——一览无余
Linux shell编程学习笔记82:w命令——一览无余
|
5月前
|
人工智能 监控 Shell
常用的 55 个 Linux Shell 脚本(包括基础案例、文件操作、实用工具、图形化、sed、gawk)
这篇文章提供了55个常用的Linux Shell脚本实例,涵盖基础案例、文件操作、实用工具、图形化界面及sed、gawk的使用。
932 2
|
5月前
|
Linux Shell
Linux系统编程:掌握popen函数的使用
记得在使用完 `popen`打开的流后,总是使用 `pclose`来正确关闭它,并回收资源。这种做法符合良好的编程习惯,有助于保持程序的健壮性和稳定性。
227 6