linux 基础IO

作者 : 开心源码 本文共3034个字,预计阅读时间需要8分钟 发布时间: 2022-05-12 共74人阅读

open函数

//功能:打开文件

int open(const char *path, int flags );

参数:

path:要打开的文件

flags:打开方式

O_RDONLY : 只读方式打开

O_WRONLY :只写方式打开

O_RDWR :读写方式打开

O_TRUNC :清空文件

O_APPEND :追加

返回值:

失败:-1

成功:文件形容符

//创立文件

int open(const char *path, int flags, mode_t mode);

path: 要创立的文件名

flags:O_CREAT

read函数

//功能: 从fd文件中读取数据到buf所指向的空间,该空间大小为len

//返回值为:实际读取的字节数

int read(int fd, char *buf, size_t len);

write函数

//功能:往fd所指的文件中写入数据,数据的起始位置为buf,大小为len

int write(int fd, const char *buf, size_t len);

close函数

int close(int fd);

fd表示文件标识符

返回值:返回0表示成功,返回-1表示失败

代码

write :

#include

#include

#include

#include

#include

#include

int main()

{

umask(0);

int fd=open(“myfile1”,O_WRONLY|O_CREAT,0644);//open函数,0644代表权限

if(fd<0){

perror(“open”);

return 1;

}

int count=5;

const char*msg=”hello world\n”;

int len=strlen(msg);

while(count–){

write(fd,msg,len+1);

}

close(fd);

return 0;

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

read:

#include

#include

#include

#include

#include

#include

int main()

{

int fd;

if( (fd=open(“mmc”,O_RDWR)) == -1)

perror(“open”),exit(1);

char buf[4] = {};

while(1)

{

memset(buf,0x00,sizeof(buf));

int r = read(fd,buf,3);

if(r<=0)

{

break;

}

printf(“%s”,buf);

fflush(stdout);

sleep(1);

}

close(fd);

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

文件形容符fd

1)概念:问价形容符是一个非常小的非负整数,内核使用以标识一个特定进程正在访问的文件。当打开一个现有文件或者创立一个新文件时,内核向进程返回一个文件形容符。

2)3个缺省的文件形容符:

(1)linux进程默认情况下有3个缺省打开的文件形容符,它们分别是标准输入0,标准输出1,标准错误2.

(2)0,1,2对应的物理设施逐个般是:键盘,显示器,显示器。

注意:POSIX定义了STDIN_FILENO,STDOUT_FILENO和STDERR_FILENO来代替0,1,2.

FILE结构体的内容

struct file结构体定义在/linux/include/linux/fs.h中,文件结构体代表一个打开的文件,系统中每个打开的文件在内核空间都有一个关联的struct file。它由内核在打开文件时创立,并传递给在文件上进行操作的任何函数,在文件的所以实例都关闭后,内核释放这个数据结构。在内核创立和驱动源码中,struct file的指针通常被命名为file或者filp。

fd属于系统库 , FILE属于c标准库;

fd是一个整数,FILE是一个结构体.

myshell实现

#include

#include

#include

#include

#include

#include

#include

int main()

{

close(1);

int fd=open(“myfile1”,O_WRONLY|O_CREAT,0644);//open函数,0644代表权限

if(fd<0){

perror(“open”);

return 1;

}

printf(“fd:%d”,fd);

fflush(stdout);

close(fd);

exit(0);

return 0;

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

静态库

静态库:对一系列.o文件打包

生成方法:

ar -cr lib库名.a 文件

libmymath.a : 库文件名

mymath :库名

用:

gcc main.c -L. -l库名

寻觅库:

/lib64

/usr/lib64

-L 库路经

动态库

动态库(共享库 shared library)

生成动态库

gcc -fPIC -shared libxxx.so xxx.c xx.c

链接动态库

gcc main.c -L. -lxxx

用动态库

1、/lib64/

/usr/lib64

2、export LD_LIBRARY_PATH=.

3、/etc/ld.conf.d/xxx.conf 文件中将动态库路径写入

代码

add.h

#ifndef __ADD_H__

#define __ADD_H__

int add(int a,int b);

#endif /// __ADD_H__

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

add.c

#include “add.h”

int add(int a,int b)

{

return a + b;

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

sub.h

#ifndef __SUB_H__

#define __SUB_H__

int sub(int a,int b);

#endif /// __SUB_H

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

sub.c

#include “sub.h” #incl

int sub(int a,int b)

{

return a – b;

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

mul.h

#ifndef __MUL_H__

#define __MUL_H__

int mul(int a,int b);

#endif /// __MUL_H

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

mul.c

#include “mul.h”

int mul(int a,int b)

{

return a * b;

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

div.h

#ifndef __DIV_H__

#define __DIV_H__

int div(int a,int b);

#endif /// __DIV_H

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

div.c

#include “div.h”

int div(int a,int b)

{

return a/b;

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

main.c

#include

#include “add.h”

#include “sub.h”

#include “mul.h”

#include “div.h”

int main()

{

int a=20;

int b=10;

printf(” %d + %d = %d\n”,a,b,add(a,b));

printf(” %d – %d = %d\n”,a,b,sub(a,b));

printf(” %d * %d = %d\n”,a,b,mul(a,b));

printf(” %d / %d = %d\n”,a,b,div(a,b));

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

makefile

.PHONY:libmymath.a clean

libmymath.a:main.o add.o sub.o mul.o div.o

ar -rc $@ $^

%.o : %.c

gcc -c $^ -o $@

clean:

rm -rf *.o

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

静态库实现

linux 基础IO

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » linux 基础IO

发表回复