使用I/O 系统调用--copy.c

作为Linux/Unix 系统编程入门,小生按照自己可以理解的方式,改写了源copy.c
源代码来自:Linux/UNIX 系统编程手册 上册 P57

#include <stdio.h>//标准输入输入头文件
#include <fcntl.h>//文件信息控制头文件 -详细信息请自行google-
#define BUF_SIZE 1024
int main(int argc,char *argv[])
{
    int inputFd,outputFd,openFlags;
    mode_t filePerms;
    ssize_t numRead;
    char buf[BUF_SIZE];

    if(argc !=3 || strcmp(argv[1],"--help") ==0 )//进行参数判断
      printf("%s old-file new-file\n",argv[0]);

    inputFd=open(argv[1],O_RDONLY);//以只读的方式打开原文件

    openFlags = O_CREAT | O_WRONLY | O_TRUNC;//位掩码,文件的访问模式--将三个域定义的常量进行‘或’运算结果赋值给openFlags,作为打开文件的方式,其值可自行验证
    filePerms=S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP|S_IROTH|S_IWOTH;//设置新文件的权限,可以只用用常量串表示 例如:421 linux 文件权限可自行google-----如果openFlags未指定O_CREAT标志,本行可以不写,即open()第三个参数不写。
    outputFd=open(argv[2],openFlags,filePerms);//打开用上面设置的打开方式和文件权限打开一个新文件

    while((numRead=read(inputFd,buf,BUF_SIZE))>0)//从源文件中读取BUF_SIZE大小的数据放到buf缓冲区
      if(write(outputFd,buf,numRead)!=numRead)//从缓冲区取出数据放到新文件中,如果不等于从源文件读出的大小,则给出错误信息
        printf("couldn‘t write whole buffer");
    return 0;
}

  

时间: 2024-11-27 20:58:54

使用I/O 系统调用--copy.c的相关文章

linux下的多进程,多线程编程

关于多进程和多线程,一直想写点什么来进行一次总结,今天终于提笔了,若有讲解错误之处,希望广大读者能给予指正.,我想从以下几个方面进行一次详解划分.第一,运用.第二,同步.第三,通信.第四,选择. 那么闲话少说,开始第一个,关于线程和进程之间的运用. 什么是进程? 有一个很官方的说法:进程是程序在计算机上的一次执行活动.但我觉得,可能这句话有点不对,应该换成进程加线程是程序在计算机上的一次执行活动才更加的合理.因为进程是资源分配的最小单位,线程是CPU调度的最小单位.所以我们看到进程的时候,应该联

Block深入浅出

研究工具 clang 为了研究编译器的实现原理,我们需要使用 clang 命令.clang 命令可以将 Objetive-C 的源码改写成 C / C++ 语言的,借此可以研究 block 中各个特性的源码实现方式. clang -rewrite-objc main.m main.m中不能包含UIKit框架,命令行中解析无法识别.包含#import <Foundation/Foundation.h>是可以支持的 C语言中变量有哪几种 自动变量 函数参数 静态变量 静态全局变量 全局变量 每种变

c汇总

1.获取文件长度 方法一: FILE* fp; fp = fopen(const char* filename, "rb"); fseek(fp, 0, SEEK_END); // fseek(fp, SEEK_SET, SEEK_END); size_t sz = (size_t) ftell(fp); fclose(fp); 方法二: int fd = open(const char* filename, O_RDONLY); struct stat st; int ret = f

(转)zero copy原理

转自: http://blog.csdn.net/zzz_781111/article/details/7534649 Zero Copy 简介 许多web应用都会向用户提供大量的静态内容,这意味着有很多data从硬盘读出之后,会原封不动的通过socket传输给用户.这种操作看起来可能不会怎么消耗CPU,但是实际上它是低效的:kernal把数据从disk读出来,然后把它传输给user级的application,然后application再次把同样的内容再传回给处于kernal级的socket.这

fork 系统调用的执行过程与调试

我们可以通过fork系统调用来处理进程创建的任务.对于进程的创建, 可以sys_clone, sys_vfork,以及sys_fork. 这些系统调用的内部都使用了do_fork.函数. 对于do_fork函数, 会copy tast_struct, 设置内核堆栈, 并且对一些特定的数据结构进行修改.其中里面还有copy_thread 函数, 会设置这个进程的cs和ip.这个是在进程的thread_info中保持的.这里的ip设置成了ret_from_fork函数(在ret_from_frok里

linux内核系统调用--sendfile函数

在apache,nginx,lighttpd等web服务器当中,都有一项sendfile相关的配置,在一些网上的资料都有谈到sendfile会提升文件传输性能,那sendfile到底是什么呢?它的原理又是如何呢? 在传统的文件传输里面(read/write方式),在实现上其实是比较复杂的,需要经过多次上下文的切换,我们看一下如下两行代码: Java代码 read(file, tmp_buf, len); write(socket, tmp_buf, len); 以上两行代码是传统的read/wr

linux标准io的copy

---恢复内容开始--- 1.linux标准io的copy #include<stdio.h> int main(int argc,char **argv) { if(argc<3) { printf("use:mycp file1 file2\n"); return -1; } FILE *src=fopen(argv[1],"r");//打开源文件 if(src==NULL) { printf("no file!\n");

Linux内核源代码情景分析-系统调用mmap()

一个进程可以系统调用mmap(),将一个已打开文件的内容映射到它的用户空间,其用户界面为: mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset). 参数fd代表着一个已打开文件,offset为文件中的起点,而start为映射到用户空间中的起始地址,length则为长度.还有两个参数prot和flags,前者用于对所映射区间的访问模式,如可写.可执行等:后者则用于其他控制目的.从应用程序设计的角度来说

【Linux】文件操作系统调用

一. 文件描述符 在Linux下使用文件描述符来表示设备文件和普通文件.文件描述符是一个整型的数据,所有对文件的操作都通过文件描述符实现.文件描述符的范围是0~OPEN_MAX,系统中有3个已经分配的文件描述符,即标准输入.标准输出.和标准错误,他们的文件描述符的值分别为0.1.2. 文件描述符是文件系统中连接用户空间和内核空间的枢纽.当打开一个或者创建一个文件时,内核空间创建相应的结构,并生成一个整型的变量传递给用户空间的对应进程,进程用这个文件描述符来对文件进行操作. 二. 打开.创建文件o