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!\n");
                 
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>中

转载于:https://www.cnblogs.com/tianchiyuyin/p/5081003.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值