别再为OLED显示小数发愁了!STM32F103C8T6 + 中景园0.96寸屏,一个sprintf函数搞定浮点数动态刷新
2026/4/19 11:26:19
父子进程关系子进程通过fork()系统调用创建,是父进程的副本。现代Linux内核(如Ubuntu 18的Linux 5.4)采用写时复制(Copy-On-Write, COW)技术:子进程初始共享父进程的内存空间,仅当任一进程尝试修改共享数据时,内核才会为子进程分配独立的内存副本。这优化了性能,避免了不必要的内存复制。
进程终止的8种情况
main()函数中执行return语句。exit(),会清理I/O缓冲区、关闭文件流、执行atexit()注册的函数。_exit(),直接终止进程但不清理缓冲区或执行atexit()函数。pthread_exit()。abort()触发SIGABRT信号。kill命令发送SIGKILL)终止进程。pthread_cancel()取消。僵尸进程
子进程终止后,其PCB(进程控制块)未被父进程回收(通过wait()或waitpid()),导致内核资源泄漏。长期运行的父进程若频繁创建短生命周期子进程,可能导致系统资源耗尽。
孤儿进程
父进程先于子进程终止时,子进程被init进程(PID 1)接管,由init负责后续回收,无需额外处理。
exit()与_exit()
exit(int status):atexit()注册的函数)。status传递退出状态(EXIT_SUCCESS或EXIT_FAILURE)。_exit(int status):执行顺序exit()→ 刷新缓冲区 → 执行atexit()注册函数 → 调用_exit()。
wait()函数
pid_t wait(int *status);status参数存储子进程退出状态,可通过宏解析:WIFEXITED(status):判断是否正常退出。WEXITSTATUS(status):获取正常退出的返回值。WIFSIGNALED(status):判断是否因信号终止。WTERMSIG(status):获取终止信号的编号。示例代码
int status; pid_t pid = wait(&status); if (WIFEXITED(status)) { printf("Child exited with status %d\n", WEXITSTATUS(status)); } else if (WIFSIGNALED(status)) { printf("Child killed by signal %d\n", WTERMSIG(status)); }exit()与_exit()的选择需根据清理需求决定。_exit()以避免缓冲区操作未完成的问题。