zoukankan      html  css  js  c++  java
  • unix lseek 函数窥视

    熟悉啦linux下打基础操作:

    先说一下makefile 吧

    利用vim写啦一个最简单的makefile

    test:l3lseek.o

      gcc l3lseek.o -o test

    clean:

      rm -rf test

      rm-rf *.o

    从这里可以学习到两方面打知识:

    1 makefile打基本写法

    目标:依赖条件

      执行命令

    这是最简单打makefile

    2 就是gcc的用法

    例:

    #include
    int main(void)
    {
          
    printf ("Hello world, Linux programming! ");
                     
    return 0;
    }

    在使用GCC编译程序时,编译过程可以被细分为四个阶段:
    1.预处理(Pre-Processing)
    2.编译(Compiling)汇编(Assembling)
    3.链接(Linking)

    gcc hello.c -o hello

    在终端上直接执行./hello 则hello程序就执行啦

    首先GCC需要调用预处理程序cpp,由它负责展开在源文件中定义的宏,并向其中插入“#include”语句所包含的内容;接着,GCC会调用ccl和as将处理后的源代码编译成目标代码;最后,GCC会调用链接程序ld,把生成的目标代码链接成一个可执行程序

    第一步是进行预编译,使用-E参数可以让GCC在预处理结束后停止编译过程:
    #  gcc -E hello.c -o
    hello.i

    此时若查看hello.cpp文件中的内容,会发现stdio.h的内容确实都插到文件里去了,而其它应当被预处理的宏定义也都做了相应的处理。下一步是将hello.i编译为目标代码,这可以通过使用-c参数来完成:
    #  gcc -c hello.i -o
    hello.

    GCC默认将.i文件看成是预处理后的C语言源代码,因此上述命令将自动跳过预处理步骤而开始执行编译过程,也可以使用-x参数让GCC从指定的步骤开始编译。最后一步是将生成的目标文件链接成可执行文件:
    #  gcc hello.o -o hello

    在采用模块化的设计思想进行软件开发时,通常整个程序是由多个源文件组成的,相应地也就形成了多个编译单元,使用GCC能够很好地管理这些编译单元。假设
    有一个由foo1.c和foo2.c两个源文件组成的程序,为了对它们进行编译,并最终生成可执行程序foo,可以使用下面这条命令:
    #  gcc foo1.c foo2.c -o
    foo

    如果同时处理的文件不止一个,GCC仍然会按照预处理、编译和链接的过程依次进行。如果深究起来,上面这条命令大致相当于依次执行如下三条命令:
    # gcc -c foo1.c -o foo1.o
    #
    gcc -c foo2.c -o foo2.o
    # gcc foo1.o foo2.o -o foo
    在项目文件代码较多时,还要借助
    像Make这样的工具

    在这里介绍一下gcc 的选项解释 

            -c 只编译并生成目标文件。

             -g 生成调试信息。GNU 调试器可利用该信息。

             -o 生成指定的输出文件。用在生成可执行文件时。
             -o2 进一步优化

    介绍完了makefile 下面来介绍一下主角lseek()函数

    它包含在 #include <unistd.h>头文件中

    函数原型为:off_t lseek(int fildes, off_t offset, int whence);

    若whence是 SEEK_SET,则将该文件的偏移量设置为距文件开始处offset个字节

    若whence是SEEK_CUR,则将该文件打偏移量设置为其当前值加offset,offset可为正或负

    若whence是SEEK_END,则将该文件打偏移量设置为文件长度加offset,offset可正或负函数说明:
    每一个已打开的文件都有一个读写位置, 当打开文件时通常其读写位置是指向文件开头, 若是以附加的方式打开文件(如O_APPEND), 则读写位置会指向文件尾. 当read()或write()时, 读写位置会随之增加,lseek()便是用来控制该文件的读写位置. 参数fildes 为已打开的文件描述词, 参数offset 为根据参数whence来移动读写位置的位移数

    函数说明:
    每一个已打开的文件都有一个读写位置, 当打开文件时通常其读写位置是指向文件开头, 若是以附加的方式打开文件(如O_APPEND), 则读写位置会指向文件尾. 当read()或write()时, 读写位置会随之增加,lseek()便是用来控制该文件的读写位置. 参数fildes 为已打开的文件描述词, 参数offset 为根据参数whence来移动读写位置的位移数

    还有exit(0)包含在#include <stdlib.h>中

  • 相关阅读:
    自定义View
    Android Parcelable
    java IO
    如何安全退出已调用多个Activity的Application?
    cookie和session
    Excel 使用AutoFill提示“类Range的AutoFill方法无效”
    解决“配置系统未能初始化”问题
    Android控件第7类——对话框
    Android控件第6类——杂项控件
    Android控件第5类——ViewAnimator
  • 原文地址:https://www.cnblogs.com/tianchiyuyin/p/5081003.html
Copyright © 2011-2022 走看看