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();//全部删除
}













原创粉丝点击