linux .o文件,Linux 文件I/O

函数open和openat

#include

int open(const char *path, int oflag, ... /* mode_t mode */);

int openat(int fd, const char *path, int oflag, ... /* mode_t mode */);

两个函数的返回值:若成功,返回文件描述符;若出错,返回-1

fd参数把open和openat函数区分开,共有三种可能性。

path参数指定的是绝对路径,在这种情况下,fd参数被忽略,openat函数就相当于open函数。

path参数指定的是相对路径,fd参数指出了相对路径名在文件系统中的开始地址。fd参数是通过打开相对路径名所在的目录来获取。

path参数指定了相对路径,fd参数具有特殊值AT_FDCWD。在这种情况下,路径名在当前工作目录中获取,openat函数在操作上与open函数类似。

函数中的oflag参数说明。

O_RDONLY 只读打开。

O_WRONLY 只写打开。

O_EXEC 只执行打开。

O_SEARCH 只搜索打开(应用于目录)。

O_APPEND 每次写时都追加到文件的尾端。

O_CLOEXEC 把FD_CLOEXEC常量设置为文件描述符标志。

O_CREAT 若此文件不存在则创建它。使用此选项时,open函数需要同时说明第三个参数mode,用mode指定该新文件的访问权限位。

O_EXCL 如果同时指定了O_CREAT,而文件已经存在,则出错。用此可以测试一个文件是否存在,如果不存在,则创建此文件,这使测试和创建两者成为一个院子操作。

O_NOCTTY 如果path引用的是终端设备,则不将该设备分配作为此进程的控制终端。

O_NOFOLLOW 如果path引用的是一个符号链接,则出错。

O_NONBLOCK 如果path引用的是一个FIFO、一个块特殊文件或一个字符特殊文件,则此选项为文件的本次打开操作和后续的I/O操作设置非阻塞方式。

O_SYNC 使每次write等待物理I/O操作完成,包括由该write操作引起的文件属性更新所需的I/O。

O_TRUNC 如果此文件存在,而且为只写或读写成功打开,则将其长度截断为0。

O_TTY_INIT 如果打开一个还未打开的终端设备,设置非标准termios参数值,使其符合Single UNIX Specification。

O_DSYNC 使每次write要等待物理I/O操作完成,但是如果该写操作并不影响读取刚写入的数据,则不需要等待文件属性被更新。

O_RSYNC 使每一个以文件描述符作为参数进行的read操作等待,直至所有对文件同一部分挂起的写操作都完成。

函数creat

#include

int creat(const char *path, mode_t mode);

返回值:若成功,返回只写打开的文件描述符;若出错,返回-1

该函数等于:

int open(const char *path, O_WRONLY | O_CREAT | O_TRUNC, mode);

函数close

#include

int close(int fd);

返回值:若成功,返回0;若出错,返回-1

关闭一个文件时还会释放该进程加在该文件上的所有记录锁。当一个进程终止时,内核自动关闭它所有的打开文件。很多程序利用了这一功能而不显式地用close关闭打开的文件。

函数lseek

#include

off_t lseek(int fd, off_t offset, int whence);

off_t为带符号整形

返回值:若成功,返回新的文件偏移量;若出错,返回-1

参数offset的解释与whence的值有关。

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

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

若whence是SEEK_END,则将该文件的偏移量设置为文件长度加offset,offset可为正或负。

如果文件描述符指向的是一个管道、FIFO或网络套接字,则lseek返回-1,并将errno设置为ESPIPE。

函数read

#include

ssize_t read(int fd, void *buf, size_t nbytes);

返回值:读到的字节数,若已到文件尾,返回0。若出错,返回-1

有多种情况可能使读到的字节数少于要求读的字节数。

读普通文件时,在读到要求字节数之前已经达到了文件尾端。

当从终端设备读时,通常一次最多读一行。

当从网络读时,网络中的缓冲机制可能造成返回值小于所要求读的字节数。

当从管道或者FIFO读时,如果管道包含的字节少于所需的数量,则read将只返回实际可用的字节数。

当从某些面向记录的设备(如磁带)读时,一次最多返回一个记录。

当被信号中断,而已经读取了部分数据时。

函数write

#include

ssize_t write(int fd, const void *buf, size_t nbytes);

返回值:若成功,返回已写的字节数;若出错,返回-1

原子操作函数pread和pwrite

#include

ssize_t pread(int fd, void *buf, size_t nbytes, off_t offset);

返回值:读到的字节数,若已到文件尾,返回0;若出错,返回-1

ssize_t pwrite(int fd, const void *buf, size_t nbytes, off_t offset);

返回值:若成功,返回已写的字节数;若出错,返回-1

调用pread相当于调用lseek后调用read,但是pread又与这种顺序调用有区别(调用pwrite与调用pread相同)。

调用pread时,无法中断其定位和读操作。

不更新当前文件偏移量。

函数dup和dup2

#include

int dup(int fd);

int dup2(int fd, int fd2);

两个函数的返回值:若成功,返回新的文件描述符;若出错,返回-1

由dup返回的文件描述符一定是当前可用文件描述符中的最小数值。对于dup2,可以用fd2参数指定新文件描述符。如果fd2已经打开,则先将其关闭。如果fd等于fd2,则dup2返回fd2,而不关闭它。否则,fd2的FD_CLOEXEC文件描述符标志被清除,这样fd2在进程调用exec时是打开状态。

函数sync, fsync, fdatasync

当我们向文件写入数据时,内核通常先将数据复制到缓冲区中,然后排入队列,晚些时候再写入磁盘。这种方式被称为延迟写(delayed write)。为了保证磁盘上实际文件与缓冲区中内容的一致性,UNIX提供了sync,fsync和fdatasync三个函数。

#include

int fsync(int fd);

int fdatasync(int fd);

返回值:若成功,返回0;若出错,返回-1

void sync(void);

sync只是将所有修改过的块缓冲区排入写队列,然后返回,它并不等待实际的写磁盘操作结束。

fsync函数只对文件描述符fd指定的一个文件起作用,并且等待写磁盘操作结束才返回。

fdatasync函数类似于fsync,但它只影响文件的数据部分。fsync还会同步更新文件的属性。

函数fcntl

fcntl函数可以改变已经打开文件的属性。

#include

int fcntl(int fd, int cmd, ... /* int arg */);

返回值:若成功,则依赖于cmd;若出错,返回-1

fcntl函数有以下5中功能。

复制一个已有的描述符(cmd = F_DUPFD或F_DUPFD_CLOEXEC)。

获取或设置文件描述符标志(cmd = F_GETFD或F_SETFD)。

获取或设置文件状态标志(cmd = F_GETFL或F_SETFL)。

获取或设置异步I/O所有权(cmd = F_GETOWN或F_SETOWN)。

获取或设置记录锁(cmd = F_GETLK, F_SETLK或F_SETLKW)。

函数ioctl

#include /* System V */

#include /* BSD and Linux */

int ioctl(int fd, int request, ...);

返回值:若出错,返回-1;若成功,返回其他值

在此原型中,我们表示的只是ioctl函数本身所要求的头文件。通常,还要求另外的设备专用头文件。例如,终端I/O的ioctl命令都需要头文件。每个设备驱动程序可以定义自己专用的一组ioctl命令,系统则为不同类型的设备提供通用的ioctl命令。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
make for plat=atlas310 cross=aarch64-ascend310-linux-gnu- LDFLAGS=-Wl,--gc-sections -static -L/home/257916/server/test/v1.1/Trunk/build/../src/thirdpart/libs/atlas310 -L/home/257916/server/test/v1.1/Trunk/build/../lib/atlas310 -ldw -lbs -lpthread -lm EXTRA_CFLAGS=-DSVN_VERSION="\"64670"\" -I /net -DOSA_MODULE_NAME=Spectrum-Convert@64670 -DBUILD_DATE="\"Mon, 24 Jul 2023 19:48:54 +0800"\" CFLAGS=-D_GNU_SOURCE -I/home/257916/server/test/v1.1/Trunk/build/../include -I/home/257916/server/test/v1.1/Trunk/build/../src/base/include -I/home/257916/server/test/v1.1/Trunk/build/../src/base/test/include -I/home/257916/server/test/v1.1/Trunk/build/../src/decode/include -I/home/257916/server/test/v1.1/Trunk/build/../src/decode/test/include -I/home/257916/server/test/v1.1/Trunk/build/../src/fourier/include -I/home/257916/server/test/v1.1/Trunk/build/../src/fourier/test/include -I/home/257916/server/test/v1.1/Trunk/build/../src/include -I/home/257916/server/test/v1.1/Trunk/build/../src/service/include -I/home/257916/server/test/v1.1/Trunk/build/../src/service/test/include -I/home/257916/server/test/v1.1/Trunk/build/../src/draw/include -I/home/257916/server/test/v1.1/Trunk/build/../src/draw/test/include -I/home/257916/server/test/v1.1/Trunk/build/../tools/include -fPIC -ffunction-sections -fdata-sections -g -Wall -O1 -c -o ############################################################ mkdir -p /home/257916/server/test/v1.1/Trunk/build/../bin/atlas310 aarch64-ascend310-linux-gnu-g++ -o draw test/src/draw_pic_test.o -Wl,--gc-sections -static -L/home/257916/server/test/v1.1/Trunk/build/../src/thirdpart/libs/atlas310 -L/home/257916/server/test/v1.1/Trunk/build/../lib/atlas310 -ldw -lbs -lpthread -lm /opt/Atlas310-ascend/toolkit/toolchain/hcc/bin/../lib64/gcc/aarch64-target-linux-gnu/7.3.0/../../../../aarch64-target-linux-gnu/bin/ld: test/src/draw_pic_test.o: Relocations in generic ELF (EM: 62) /opt/Atlas310-ascend/toolkit/toolchain/hcc/bin/../lib64/gcc/aarch64-target-linux-gnu/7.3.0/../../../../aarch64-target-linux-gnu/bin/ld: test/src/draw_pic_test.o: Relocations in generic ELF (EM: 62) /opt/Atlas310-ascend/toolkit/toolchain/hcc/bin/../lib64/gcc/aarch64-target-linux-gnu/7.3.0/../../../../aarch64-target-linux-gnu/bin/ld: test/src/draw_pic_test.o: Relocations in generic ELF (EM: 62) /opt/Atlas310-ascend/toolkit/toolchain/hcc/bin/../lib64/gcc/aarch64-target-linux-gnu/7.3.0/../../../../aarch64-target-linux-gnu/bin/ld: test/src/draw_pic_test.o: Relocations in generic ELF (EM: 62) /opt/Atlas310-ascend/toolkit/toolchain/hcc/bin/../lib64/gcc/aarch64-target-linux-gnu/7.3.0/../../../../aarch64-target-linux-gnu/bin/ld: test/src/draw_pic_test.o: Relocations in generic ELF (EM: 62) /opt/Atlas310-ascend/toolkit/toolchain/hcc/bin/../lib64/gcc/aarch64-target-linux-gnu/7.3.0/../../../../aarch64-target-linux-gnu/bin/ld: test/src/draw_pic_test.o: Relocations in generic ELF (EM: 62) /opt/Atlas310-ascend/toolkit/toolchain/hcc/bin/../lib64/gcc/aarch64-target-linux-gnu/7.3.0/../../../../aarch64-target-linux-gnu/bin/ld: test/src/draw_pic_test.o: Relocations in generic ELF (EM: 62) /opt/Atlas310-ascend/toolkit/toolchain/hcc/bin/../lib64/gcc/aarch64-target-linux-gnu/7.3.0/../../../../aarch64-target-linux-gnu/bin/ld: test/src/draw_pic_test.o: Relocations in generic ELF (EM: 62) /opt/Atlas310-ascend/toolkit/toolchain/hcc/bin/../lib64/gcc/aarch64-target-linux-gnu/7.3.0/../../../../aarch64-target-linux-gnu/bin/ld: test/src/draw_pic_test.o: error adding symbols: file in wrong format collect2: error: ld returned 1 exit status make[1]: *** [draw] Error 1 make[1]: Leaving directory `/home/257916/server/test/v1.1/Trunk/src/draw' make: *** [draw] Error 2
07-25
根你提供的信息,编译过程中出现了一个错误。错误信息显示 ld (链接器) 试图处理一个格式错误的文件。 具体来说,ld 报告了以下错误: ``` /opt/Atlas310-ascend/toolkit/toolchain/hcc/bin/../lib64/gcc/aarch64-target-linux-gnu/7.3.0/../../../../aarch64-target-linux-gnu/bin/ld: test/src/draw_pic_test.o: error adding symbols: file in wrong format collect2: error: ld returned 1 exit status ``` 这个错误通常发生在尝试链接不兼容的目标文件时。可能有以下几个原因导致这个错误: 1. 目标文件 `test/src/draw_pic_test.o` 的格式不正确,不符合链接器的预期。你可能需要检查这个目标文件是否由正确的编译器生成,并且是否与你的交叉编译目标匹配。 2. 链接器正在尝试将不同架构的目标文件链接在一起。请确保你的交叉编译环境配置正确,并且编译器和链接器的目标架构与你的目标平台一致。 3. 缺少必要的库文件。请确保你的链接命令中指定的库文件存在,并且位于正确的位置。 针对这个错误,你可以尝试以下几个步骤来解决问题: 1. 检查目标文件的生成方式和来源。确保使用正确的编译器和编译选项生成目标文件,并确认目标文件的格式正确。 2. 检查你的交叉编译环境配置,确保交叉编译器和链接器的目标架构与你的目标平台一致。 3. 检查链接命令中指定的库文件路径是否正确,并确保库文件存在。 如果问题仍然存在,可能需要更多的上下文信息来进行进一步的诊断和解决。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值