linux 基础IO
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<stdio.h>
#include<string.h>
#include<fcntl.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
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";
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 <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
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<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<fcntl.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
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 <stdio.h>
#include "add.h"
#include "sub.h"
#include "mul.h"
#include "div.h"
int main()
{
int a=20;
int b=10;
printf(" %d + %d = %d",a,b,add(a,b));
printf(" %d - %d = %d",a,b,sub(a,b));
printf(" %d * %d = %d",a,b,mul(a,b));
printf(" %d / %d = %d",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
静态库实现
动态库实现
直接./a.out有错误,更改一下 LD_LIBRARY_PATH
(方法:export LD_LIBRARY_PATH=.)