APUE之open,read,write,close函数应用,制作基本的makefile。

2 篇文章 0 订阅
1 篇文章 0 订阅

条件:将文件A中的内容写入文件B中。其中需要判断文件A,B是否存在。若B存在则删除以前内容,再将A中内容写入。


dd.c

/*********************************************************************************
 *      Copyright:  (C) 2014 songyong<handy_skyoutlook.com>
 *                  All rights reserved.
 *
 *       Filename:  dd.c
 *    Description:  This file 
 *                 
 *        Version:  1.0.0(2014年12月19日)
 *         Author:  sky <handy_sky@outlook.com>
 *      ChangeLog:  1, Release initial version on "2014年12月19日 20时38分08秒"
 *                 
 ********************************************************************************/

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>

#define BUF_SIZE 128
/********************************************************************************
 *  Description:
 *   Input Args:
 *  Output Args:
 * Return Value:
 ********************************************************************************/
int main (int argc, char **argv)
{
    char     *src_file;
    char     *dst_file;

    int      fd_src;
    int      fd_dst;
    char     buf[BUF_SIZE];
    int      len;

    if(argc != 3)
    {
        printf("usage: %s [src_file] [dst_file]\n", argv[0]);//不符合参数个数即报错.
        return -1;
    }
    src_file    =   argv[1];
    dst_file    =   argv[2];

    fd_src  =   open(src_file,O_RDONLY);
    if(fd_src < 0)
    {
        printf("Open file '%s' failure: %s\n",src_file,strerror(errno));
            return 0;
    }

    fd_dst  =   open(dst_file,  O_RDWR|O_CREAT|O_TRUNC,0755);
    if(fd_dst   < 0)
    {
        printf("Open file '%s' failure: %s\n",dst_file,strerror(errno));
            return 0;
    }
    
    while ((len = read(fd_src,buf,sizeof(buf)))  >  0) 
    {
        write(fd_dst,buf,len);
    }
    close(fd_src);
    close(fd_dst);

    return 0;
} /* ----- End of main() ----- */


makefile

bins    =       dd
objs    =       dd.o
srcs    =       dd.c

$(bins) :       $(objs)
        gcc -o dd dd.o
$(objs) :       $(srcs)
        gcc -c dd.c

clean:
        rm -f $(bins) (objs)


附上makefile的制作规则:

target ... : prerequisites ...
command
...
...

target也就是一个目标文件,可以是Object File,也可以是执行文件。还可以是一个标签(Label)。
prerequisites就是,要生成那个target所需要的文件或是目标。
command也就是make需要执行的命令。(任意的Shell命令)

这是一个文件的依赖关系,也就是说,target这一个或多个的目标文件依赖于prerequisites中的文件,其生成规则定义在command中。说白一点就是说,prerequisites中如果有一个以上的文件比target文件要新的话,command所定义的命令就会被执行。
我初步理解的决定关系为:

                  .h or .c文件 → (- c)→.o → (- o)→可执行的目标文件.
gcc:
        -o output_filename,确定输出文件的名称为output_filename,同时这个名称不能和源文件同名。如果不给出这个选项,gcc就给出预设的可执行文件a.out。
-c 只编译代码生成object目标文件但不进行链接。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值