• 【linux应用开发】


    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
    
    • 1
    • 2
    • 3

    5、文件I/O

    首先看一下,文件I/O与标准I/O的比较

    文件I/O(低级I/O,系统调用)标准I/O(调的libc库)
    打开openfopen,freopen,fdopen
    关闭closefclose
    readgetc、fgetc、getchar
    gets、fgets
    fread
    writeputc、fputc、putchar
    puts、fputs
    fwrite
    表示文件描述符
    缓存不带缓存全缓存、行缓存、不带缓存
    可访问文件类型普通文件、设备文件、管道文件一般只访问普通文件

    文件I/O每次操作都执行系统调用,而标准I/O则是对系统调用进行封装,可以看作是在文件I/O的基础上封装了缓冲机制,先读写缓冲区,必要时再访问实际的文件。减少频繁系统调用。

    备注:
    printf 函数是行缓冲,也就是说遇到’\n’后,才将缓冲区里的内容刷出来,否则就一直在缓冲区里。
    eg.

    /*
     *该程序运行结果为:先等5秒,在显示hahahahahahahahahaha
     *产生此结果的原因时,printf为行缓冲,也就是说,没有遇到\n,数据就会一直存在缓冲区,只有遇到\n才会将缓冲区内的数据一次性刷出来
     */
    #include 
    int main(void)
    {
    	int i=0;
    	//setbuf(stdout, NULL);
    	for(i=0;i<5;i++)
    	{
    		printf("haha");
    		sleep(1);
    		//fflush(stdout);
    	}
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    如果想先打印haha,再sleep 1s,再打印haha,再sleep 1s,如此重复5次。那么有以下两种方式:

    1)关闭行缓冲

    setbuf(stdout, NULL)

    /*
     *该程序运行结果为:先打印haha,再sleep 1s,再打印haha,再sleep 1s,如此重复5次
     */
    #include 
    int main(void)
    {
    	int i=0;
    	setbuf(stdout, NULL);  //关闭行缓冲
    	for(i=0;i<5;i++)
    	{
    		printf("haha");
    		sleep(1);
    	}
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    2)用fflush将缓冲区内的数据刷出来

    fflush(stdout);

    /*
     *该程序运行结果为:先打印haha,再sleep 1s,再打印haha,再sleep 1s,如此重复5次
     */
    #include 
    int main(void)
    {
    	int i=0;
    	for(i=0;i<5;i++)
    	{
    		printf("haha");
    		sleep(1);
    		fflush(stdout);    //将缓冲区内的数据刷出
    	}
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    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、多线程编程

    全局变量(作为标志位)
    信号量
    互斥量(锁)

    11、串口编程

    12、I2C应用编程

  • 相关阅读:
    为什么 NGINX 的 reload 命令不是热加载?
    命令行参数、环境变量
    基于springboot+vue的大学生创新创业系统(前后端分离)
    飞思卡尔 S12 (X)串口下载移植
    【无人机】太阳能伪卫星VoLTE无人机设计(Matlab代码实现)
    OVS-DPDK 流表查询详解
    javac不是内部命令
    基地址:环境变量
    企业内业务系统与Activiti流程引擎的结合(十二)
    在Jetson Nano上安装MNN深度学习框架
  • 原文地址:https://blog.csdn.net/weixin_43442758/article/details/127713668