1、编译过程(4个)
预处理、编译、汇编、链接
2、交叉编译
交叉编译:在当前平台编译,可在其他平台运行
如在X86平台编译,可在ARM平台运行
3、GCC的使用
-E : 预处理(进行宏展开等) 使用:执行 gcc -E test.c 生成test.i
-S : 编译 (生成汇编代码) 使用: 执行 gcc -S test.c 生成test.S
-c : 汇编(生成机器码) 使用: 执行 gcc -c test.c 生成test.o
-o : 链接(生成可执行文件) 使用:执行 gcc test.c (-o test) 当没有-o,生成a.out,当有-o test,生成test
4、Makefile使用
$@ : 目标文件
$< : 第一个依赖文件
$^ : 所有依赖文件
wildchard : 获取指定路径指定文件加的所有文件,可改变文件名
Makefile中格式:
目标文件:依赖文件
test:test1.c test2.c test3.c
gcc $^ -o $@ //即gcc test1.c test2.c test3.c -o test
gcc $< -o $@ //即gcc test1.c -o test
5、文件I/O
首先看一下,文件I/O与标准I/O的比较
文件I/O(低级I/O,系统调用) | 标准I/O(调的libc库) | |
---|---|---|
打开 | open | fopen,freopen,fdopen |
关闭 | close | fclose |
读 | read | getc、fgetc、getchar gets、fgets fread |
写 | write | putc、fputc、putchar puts、fputs fwrite |
表示 | 文件描述符 | 流 |
缓存 | 不带缓存 | 全缓存、行缓存、不带缓存 |
可访问文件类型 | 普通文件、设备文件、管道文件 | 一般只访问普通文件 |
文件I/O每次操作都执行系统调用,而标准I/O则是对系统调用进行封装,可以看作是在文件I/O的基础上封装了缓冲机制,先读写缓冲区,必要时再访问实际的文件。减少频繁系统调用。
备注:
printf 函数是行缓冲,也就是说遇到’\n’后,才将缓冲区里的内容刷出来,否则就一直在缓冲区里。
eg.
/*
*该程序运行结果为:先等5秒,在显示hahahahahahahahahaha
*产生此结果的原因时,printf为行缓冲,也就是说,没有遇到\n,数据就会一直存在缓冲区,只有遇到\n才会将缓冲区内的数据一次性刷出来
*/
#include <stdio.h>
int main(void)
{
int i=0;
//setbuf(stdout, NULL);
for(i=0;i<5;i++)
{
printf("haha");
sleep(1);
//fflush(stdout);
}
return 0;
}
如果想先打印haha,再sleep 1s,再打印haha,再sleep 1s,如此重复5次。那么有以下两种方式:
1)关闭行缓冲
setbuf(stdout, NULL)
/*
*该程序运行结果为:先打印haha,再sleep 1s,再打印haha,再sleep 1s,如此重复5次
*/
#include <stdio.h>
int main(void)
{
int i=0;
setbuf(stdout, NULL); //关闭行缓冲
for(i=0;i<5;i++)
{
printf("haha");
sleep(1);
}
return 0;
}
2)用fflush将缓冲区内的数据刷出来
fflush(stdout);
/*
*该程序运行结果为:先打印haha,再sleep 1s,再打印haha,再sleep 1s,如此重复5次
*/
#include <stdio.h>
int main(void)
{
int i=0;
for(i=0;i<5;i++)
{
printf("haha");
sleep(1);
fflush(stdout); //将缓冲区内的数据刷出
}
return 0;
}
6、Frambuffer应用编程
7、文字、图像显示
8、输入系统应用编程
9、网络编程
进程间通信方式(6种):
socket、信号量、信号、管道、消息队列、共享内存
简单解释
信号量:计数,保证同一时间,只被一个进程修改
信号:如 键盘按下 ctr + c 会产生 SIGINT信号
管道:如 ps -aux | grep …
共享内存:多个进程共享一处物理内存
基于TCP的socket:
Server:socket、bind、listen、accept、send/recv、close
Client:socket、connect、send/recv、close
基于UDP的socket:
Server:socket、bind、send/recv、close
Client:socket、connect、send/recv、close
或者
Server:socket、bind、sendto/recfrom、close
Client:socket、sendto/recfrom、close
10、多线程编程
全局变量(作为标志位)
信号量
互斥量(锁)