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;
带参数的宏 编译时
函数:执行时
优 简单替换 节约时间
缺 没有类型
1 带参数的宏
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()