一、文件的操作:(open、read、write、close)
程序代码:
1)读文件
[chaiyandong@localhost linux_work]$ cat read.c
//读文件#include<stdio.h>
#include<string.h>
//主函数
int main(){
FILE* fp = fopen("myfile","r");
if(!fp){
printf("fopen error!\n");
}
char buf[1024];
const char *msg = "hello world\n";
while(1){
//注意返回值和参数,此处有陷阱,仔细查看man守则关于该函数到说明
ssize_t s = fread(buf,1,strlen(msg),fp);
if(s>0){
buf[s] = 0;
printf("%s",buf);
}
if(feof(fp)){
break;
}
}
fclose(fp);
return 0;
}
2)写文件
[chaiyandong@localhost linux_work]$ cat write.c
//写文件
#include<stdio.h>
#include<string.h>
int main(){
//文件到打开
FILE *fp = fopen("myfile","w");
if(!fp){
printf("fopen error\n");
}
const char*msg = "hello world\n";
int count = 5;
while(count--){
fwrite(msg,strlen(msg),1,fp);
}
//文件到关闭
fclose(fp);
return 0;
}
二、动态(静态)库的打包:
1)静态库(.a):程序在编译链接的时候把库的代码连接到可执行文件中。程序运行的时候将不再需要静态库。
2)动态库(.so):程序在运行时候才去链接动态库的代码,多个程序共享使用库的代码。
3)一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目录文件的整个机器码。
4)在可执行文件开始以前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中,这个过程称为动态链接。
5)动态库可以在多个程序间共享,所以动态链接使得可执行文件更小,节省了磁盘空间。操作系统采用虚拟内存机制允许物理内存中的一份动态库被用到该库的所有进程共用,节省了内存和磁盘空间。
测试代码:
(1)#include"add.h"
int add(int a,int b){
return a+b;
}
#define __ADD_H__
int add(int a,int b);
#endif //__ADD_H__
(3)#include"sub.h"
int sub(int a,int b){
return a-b;}
(4)#ifndef __SUB_H__
#define __SUB_H__int sub(int a,int b);
#endif //__SUB_H__
生成静态库:(示例)
[chaiyandong@localhost linux_work]$ ls
add.c add.h add.o a.out lib.c main.c makefile myfile myshell1.c myshell.c pipe.c read.c sub.c sub.h sub.o work4r write.c[chaiyandong@localhost linux_work]$ ar -rc libmymath.a add.o sub.o
[chaiyandong@localhost linux_work]$ ls
add.c add.h add.o a.out lib.c libmymath.a main.c makefile myfile myshell1.c myshell.c pipe.c read.c sub.c sub.h sub.o work4r write.c
查看静态库中的目录列表:
[chaiyandong@localhost linux_work]$ ar -tv libmymath.a
rw-rw-r-- 500/500 683 Apr 10 01:24 2018 add.o
rw-rw-r-- 500/500 687 Apr 10 01:24 2018 sub.o
1)shared:表示生成共享库格式。
2)fPIC:产生位置无关码(position independent code)。
3)库名格式:lib***.so
示例:
[chaiyandong@localhost lib.c]$ ls
add.c add.h main main.c sub.c sub.h
[chaiyandong@localhost lib.c]$ gcc -fPIC -c sub.c add.c
[chaiyandong@localhost lib.c]$ gcc -shared -o libmymath.so add.o sub.o
[chaiyandong@localhost lib.c]$ ls
add.c add.h add.o libmymath.so main main.c sub.c sub.h sub.o