linux c学习 day02
来源:互联网 发布:mysql 查询赋值给变量 编辑:程序博客网 时间:2024/05/22 06:40
在某些特殊情况下,程序员可以直接调用共享库中的函数,使用函数如下:
#include<dlfcn.h>
1.打开库:void *dlopen(char *filename,int)
int 的值可以是RTLD_LAZY (延迟加载)RTLD_NOW(立即加载)
2.取得函数:void * dlsym(void * 库指针,char * funcname)
3.执行函数
4.关闭库文件 dlclose(void * 库指针)
注:函数dlerror用于判断是否出错
char * dlerror(void)
返回NULL代表正确,否则错误信息。
程序案例:
#include<stdio.h>
#include<dlfcn.h>
int main(void){
void *handler =dlopen("lib/libmyku.so",RTLD_NOW) ; //lib文件夹在当前位置,获取库指针;
char* error=dlerror() ;//获取错误信息,返回为NULL表示错误;
if(error/*!=NULL*/){//非空指针为真,
printf("打开失败%s\n",error) ;
return -1 ;
}
double (*f) (double,double) ;//声明函数指针,用于获取库函数地址
f =dlsym(handler,"add2") ;//返回函数指针,add2为库函数名
error =dlerror() ;
if(error){
printf("函数查找失败:%s\n",error) ;
return -1 ;
}
double r=f(10.0,20.0) ;
printf("r=%lf\n",r) ;
dlclose(handler) ;
return 0 ;
}
gcc main.c -lmyku.so -L./lib/ 生成可执行文件 a.out
程序执行必须配置路径:export LD_LIBRARY_PATH=./lib/:$LD_LIBRARY_PATH
程序运行时需要动态加载动态库 ,所以必须指定动态库路径。、
c程序员对错误的处理:
1.返回一般用户数据
-1:表示异常 ,其他就是用户数据
2.返回指针用户数据
NULL指针,0xFFFFFFFF,指针表示错误
其他就是指针用户数据
3.返回值不是用户数据,只是用来指明函数调用状态
0:成功
-1:失败
需要带回数据时用指针带回数据
4.返回void 一般不会发生错误
错误处理设计练习:
有4个函数,设计一下错误处理方式并调用。
1 max 取两个数的最大值,如果相等,返回错误。
(-1代表错误,指针取最大值)
2 rand100()返回0-99的随机数,如果随机到了50,返回错误。(返回数值,返回-1代表错误)
3 根据传入的数字返回字符串,如果数字大于0,返回字符串ok,否则返回错误。(NULL)
4 打印传入的字符串,不需要考虑错误问题。(void)
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
int max(int x,int y,int *max){
if(x>y)
*max =x ;
else if(x<y)
*max =y ;
else return -1 ;
return 0 ;
}//比较两个数大小,返回最大值,指针取回结果,返回0,如果相等,失败返回-1 ;
int rand100(){
srand(time(0)) ;//srand(time(0))设置随机种子
int r = rand()%100 ;产生0-99的随机数,如果不设置随机种子,rand()返回的值每次都相同;
if(50 ==r) return -1 ;
return 0;
}//
char * get(int a){
if(a>0) return "ok" ;
else return NULL ;
}
void printstr(char * str){
printf("%s\n",str) ;
}
int main() {
int ma ;
int r =max(-2,-1,&ma) ;
if(r==-1){
printf("出错了\n");
return -1 ;
}
printf("max=%d\n",ma) ;
r =rand100() ;
if(r==-1){
printf("出错了\n") ;
return -1 ;
}
printf("rand=%d\n",r) ;
char * str =get(0) ;
if(str ==NULL){
printf("出错了\n")
return -1 ;
}
printf("str=%s\n",str) ;
printfstr("hello\n") ;
return 0 ;
}
C语言提供了错误信息的函数和变量
外部全局变量errono存储了错误的编号
strerror可以把errno变成错误的信息
perror/printf("%m")打印错误信息
#include <stdio.h>
#include <errno.h>
#include <string.h> //针对strerror
int main(){
FILE * file = fopen("/etc/passwd0","r");
if(file == NULL){//判断是否出错
printf("ERROR1: %m\n");
printf("ERROR2: %s\n",strerror(errno));
perror("ERROR3");//打印错误信息 常用perror打印附加错误信息。
printf("errno=%d\n",errno);
//return -1;
}else{
printf("open ok\n");
}
FILE * file2 = fopen("/etc/passwd","r");
if(errno!=0){
printf("错误\n");
}else{
printf("成功\n");
}
return 0;
}
环境表
所有环境变量存在一个外部全局变量environ中.(需要extern)
#include <stdio.h>
#include <string.h>
int main(){
extern char** environ;
char **p = environ;//不直接移动全局变量指针
//p是一个字符串的数组(二级指针),要求循环打印出内容
while(*p/*!=NULL*/){//*p就是一个字符串
//printf("%s\n",*p);
//*p++;
printf("%s\n",*p++);
}
char value[100] = {};//
//练习:把LANG环境变量的值存入value
//提示:strncmp比较头n个/strcmp 全部比较
p = environ;//指针回到起始位置
while(*p){
if(strncmp(*p,"LANG=",5) == 0){
//value = *p+5;//数组格式字符串不能直接赋值
strcpy(value,*p+5);
break;
}
p++;//移动指针到下一个字符串
}
printf("value=%s\n",value);
}
#include <stdio.h>
#include <stdlib.h>
int main(int argc,char** argv,char **env){
extern char ** environ;//env也是环境表
printf("env=%p,environ=%p\n",env,environ);
char *value = getenv("LANG");
printf("value=%s\n",value);//语言
putenv("VAR=abc");
putenv("LANG=C");
printf("LANG=%s\n",getenv("LANG"));//替换
setenv("VAR","123",0);//不变
printf("VAR=%s\n",getenv("VAR"));
setenv("VAR","123",1);//修改
printf("VAR=%s\n",getenv("VAR"));
unsetenv("VAR");//单删
printf("VAR=%s\n",getenv("VAR"));
clearenv();//全部删除
}
- linux c学习 day02
- c语言学习day02
- Linux 学习day01-day02
- linux学习-day02
- linux学习--day02
- C (day02)
- Linux学习笔记 -- day02 集群介绍
- linux--day02
- Linux学习笔记 -- day02 目录与文件命令
- C语言DAY02 - 数据类型
- C语言,day02
- Linux 笔记day02
- java 学习笔记 day02
- 每天学习JAVA---day02
- C++学习日记day02
- java学习day02
- Jquery学习笔记---Day02
- C++ 学习笔记day02
- opencv将视频序列转换为图像序列保存
- nagios能正常启动的情况下,发不出邮件
- 二手车筛选栏JS
- QueryPerformanceFrequency高精度计时
- Java读书笔记02 基础知识
- linux c学习 day02
- 推荐引擎算法学习导论:协同过滤、聚类、分类
- 图,网路与邻接矩阵
- QueryPerformanceFrequency,RDTSC,CPU频率
- C# 多线程和UI交互 Beginvoke
- 二分查找
- projects in visual studio 2010
- 【SVM之菜鸟实现】—5步SVM
- 第二章,变量和基本类型