apue 2013-03-18

Apue函数(linux系统调用(linux api)

5分钟

函数名:功能 不需要记参数

Int main()

{

例如没有复杂算法

Open();         ->opendir();

Read();复杂     ->{

Printf(); readdir();

Close();    } closedir();

}

函数实现 内核源代码   低版本

国外操作系统原理      操作系统原理   

Fgets(输入);

Fputs(输出)  const

 

栈:结束完释放     指针 -> 函数

 

为什么要使用函数

函数:重复使用同一段代码~  c++继承

 

自定义函数:

1,函数声明   void fun(void);    

2,函数调用   fun();

3,函数的定义(实现):void fun(void)  {

Printf ();}

被调   ->  主调

 

函数多了  ->

声明多了  ->头文件.h

函数库   1, gcc -c a.c

2,ar -rs libxxx.a  a.o b.o c.o

动态库   1, gcc -c -fpic  a.c  ->a.o

2,gcc -shared  -fpic  -o libxxx.so  a.o b.o

分模块

Main.c  a.h a.c b.h b.c  makefile自动生成

代码一般在140行出错   分文件  

自定义函数:自己实现某个功能

函数声明

数据类型  函数名<形参列表>

数据类型;返回值类型 没有void  是否成功   linux  默认int

函数名:地址常量

参数列表:  没有void int 多个:,分割

 

调用

函数名  (实际参数(表达式));先计算再传值

 

实现:

数据类型  函数名(形参列表名字)

{

函数功能;           思路

}

 

编写一个函数,找两个数的最大值

输入:     

输出:

返回值:

 

功能

名字

输入

输出

作者

日期

版本

 

输入:两个数

输出:一个数

返回值:一个数

 

测试

 

声明:int fun(int,int)

实现: int fun(int a,int b)   有什么区别

 

执行(表达式)计算  传

过程  栈   x=10

Y=20     寄存器

回收空间  a=10

B=20        return 数据寄存器

20

 

Pthread_create();同时执行

Fork();  两份

 

执行过程:计算 栈空间  运算  结束  回收空间

 

写简单的东西   

#include N 100  'N'  "N"  替换不了

#define N(a)   a+3

Int b=N(10)  13  相当于函数名

   Int b =10 + 3;

带参数的宏  编译时

函数:执行时

 

优  简单替换 节约时间

缺  没有类型

 

带参数的宏

2 inline  内联函数

 

函数声明时加inline

内联函数  :编译时向编译器提出申请

Inline  int  fun(int a,int b);   展开  不一定

原则:不能出现循环   用时没有循环

有时当作函数   很有用

 

反汇编:objdump   call

 

总结:把以前的所有数据类型都通过参数传递给函数

实参与形参没有影响

 

Void fun1(int a,int b);

Void fun2(char ch,char cc);

Void fun3(int arr[],int len);

起始地址  开始  多少个数据有效

Int i;for (i-0;i<sizeof(arr);i++)

Arr[i];   len   形式

Void  fun4(int *arr, int len);   等价

Void fun5(char *buf);  '\0'   字符串

Char a[]="abcd";   5

Fun5(a);

Fun5("abcd");  

Open("a.c");   字符串

Fun5(argv[0]);   

指针数组   char *p[5]={buf1,buf2,buf3,buf4,buf5};

通过函数交换两个变量的值

 

{

Int a=10;

Int b=20;

Printf ("");

Fun();

Printf ("");

}

 

Void  fun6(char *a,  char *b)

{

Int tmp;

Tmp=*a;

*a=*b;

*b=tmp;

}

地址占4个字节

 

两瓶水两瓶油

地址与地址       没有区别

 

 

Char *p ="abcd";

Char *q="1234";

Printf ("p=%s q=%s\n",p,q);

Fun();

Printf ("p=%s q=%s\n",p,q);

 

常量   ->   文本段   数据空间

保存指针的地址    二级指针

 

必会

文件函数  open()  read()  write()  lseek()  close()

所有设备

了解  fcntl(); ioctl();

记住;dup()  dup2()

 

 

posted @ 2013-03-18 22:00  王井玉  阅读(134)  评论(0编辑  收藏  举报