那么本文,我们来学习进程等待,我们从三个方面来看,进程等待是什么?为什么要等待?等待是在做什么?从以上几个方面,相信同学对于Linux中的进程等待有更深层次的理解。...进程等待是什么 思考:什么情况下会发生等待的情况? 情况实例:父进程创建了子进程,父进程任务结束,子进程还没有结束,父进程需要等待子进程退出。这种情况就是等待。 那么不等待会引发的后果是什么呢?...进程等待都在做什么 前面两点,即便是没有学习过进程等待的都应该知道有那么回事,今天的重点实际上是在等待子进程的时候父进程是在做什么。...不完全是的,父进程等待的时候分为两种等待,一种是阻塞等待,一种是非阻塞等待,对于阻塞等待,就像scanf,输入数据之后,需要等待键盘数据就绪,这是一种阻塞,而子进程本质也是软件,父进程实际上就是等待该软件就绪...至于等待的三种情况,等待成功,pid_t返回的值是大于0,==0代表的是等待成功,但是子进程正准备结束了,< 0代表的是等待失败。
缓冲区的本质就是一段内存。...数据可以直接拷贝到缓冲区,高速设备不用在等待低速设备,提高计算机的效率。...3.在哪里 缓冲区的位置究竟在哪里:从上面的例子我们直接往显示器上打印结果为4条,往文件打印为7条,这跟缓冲区有关,同时这也说明了缓冲区一定不在内核中,为什么?...我们之前谈论的所有缓冲区都指的是用户级语言层面提供的缓冲区。...FILE结构体缓冲区,所以我们直接要强制刷新的时候fflush(文件指针),关闭文件fclose(文件指针),这是因为传进去的文件指针对应的缓冲区 从源码出发,我们可以来看一看FILE结构体: 所以我们一般所说的缓冲区是语言级别的缓冲区
虽然以太网接口和USB接口也是以一个串行流进行数据传送的,但是串口连接通常特指那些与RS-232标准兼容的硬件或者调制解调器的接口。废话少讲,今天来解剖使用串口时的编程代码细节。...上面的代码是使用串口的第一步,来解释下都是啥意思。...来瞧瞧: 第21-22行,定义了一个用来配置串口属性的结构体: struct termios serial; bzero(&serial, sizeof(serial)); 第24行,将串口设置为raw...cfsetispeed(&serial, B9600); cfsetospeed(&serial, B9600); 第28-32行,设置串口控制属性(c_cflag),其中: serial.c_cflag...: tcsetattr(fd,TCSANOW,&serial); 当然,上面的 fd 就是系统中的某一个你想要设置的成上面那样的属性参数的串口,比如就拿粤嵌GEC210开发板来说,他有四个串口,其中第一个就已经被用于终端控制了
/* * uart 打开分析 * * 问题: 当应用程序调用open系统调用函数,那么是如何open串口的?...也就是s3c24xx_serial_ops*/ uport->ops->startup(uport); } /* * 此函数就是去打开rx和tx的中断,然后使能中断 * 然后就是一直等待中断的到来
前言:接着前面进程终止,话不多说我们进入Linux进程等待的学习,如果你还不了解进程终止建议先了解: Linux进程终止 本篇主要内容: 什么是进程等待 为什么要进行进程等待 如何进程等待...进程等待的概念 首先在开始之前我们提个问题,到底什么是进程等待?...进程等待的概念: 我们通常说的进程等待其实是通过wait/waitpid的方式,让父进程(一般)对子进程进行资源回收的等待过程,父进程必须等待这个子进程结束后,处理它的代码和数据! 2....进程等待必要性 在了解完进程等待的概念后,新的问题出现了,我们为什么要进行进程等待,进程等待的必要性是什么?...进程等待的方法 3.1 wait方法 我们可以通过系统调用来等待进程:wait函数 wait等待任意一个子进程的退出,如果等待成功他将返回子进程的pid,失败则返回-1 我们就用一段代码来看看wait:
最近在了解嵌入式方面的知识,就随笔记录一下: 查看Linux本机串口: 1、查看串口是否可用 可以对串口发送数据比如对com1口,echo /dev/ttyS0 2、查看串口名称使用 ls...-l /dev/ttyS* 一般情况下串口的名称全部在dev下面,如果你没有外插串口卡的话默认是dev下的ttyS*,一般ttyS0对应com1,ttyS1对应com2,当然也不一定是必然的; 3、...查看串口驱动 cat/proc/tty/drivers/serial 4、查看串口设备 dmesg | grep ttyS* 5、查一下板子上的串口有没有设备 grep tty/proc.../dev下应该有一个USB串口:/dev/ttyUSB0. 当一个串行卡或数据卡被侦测到时,它会被指定成为第一个可用的串行设备。...PC上的串口一般是ttyS,板子上Linux的串口一般叫做ttySAC; 串口使用: 如果需要查看这个串口设备输出: cat ttyUSB0 如果需要对这个设备输入: echo yaoxu > ttyUSB0
,而 task_list 字段用于保存等待资源的进程列表。...向等待队列添加等待进程 要向 waitqueue 添加等待进程,首先要声明一个 wait_queue_t 结构的变量,wait_queue_t 结构定义如下: typedef int (*wait_queue_func_t...task_list: 用于连接其他等待资源的进程。...唤醒等待队列 当资源准备好后,就可以唤醒等待队列中的进程,可以通过 wake_up() 函数来唤醒等待队列中的进程。...--nr_exclusive) break; } } 可以看出,唤醒等待队列就是变量等待队列的等待进程,然后调用唤醒函数来唤醒它们。
/*串口read函数分析 * 当应用程序调用read系统调用时,会调用tty_fops中的tty_read * 接下来分析tty_read函数 * * 其中最重要的就是ld->ops->read(tty...* 那么当我们的串口有数据的话,当然就调用我们以前注册的rx中断函数了。...unsigned int ufcon, ch, flag, ufstat, uerstat; int max_count = 64; while (max_count-- > 0) { /*读取UFCON串口配置寄存器...*/ ufcon = rd_regl(port, S3C2410_UFCON); /*读取 UFSTAT串口状态寄存器。...这才是真正的拷贝数据到tty->read_buf中去*/ tty->read_head = (tty->read_head + i) & (N_TTY_BUF_SIZE-1); /*其实read_buf是一个环形缓冲区
head, circ->tail, UART_XMIT_SIZE); if (count < c) c = count; if (c <= 0) break; /*拷贝数据到循环缓冲区
查看Linux本机串口: 1、查看串口是否可用 如果需要查看这个串口设备输出: cat ttyUSB0 如果需要对这个设备输入: echo yaoxu > ttyUSB0 常用的调试工具有: minicom...cutecom Linux系统可视化串口应用软件,使用上与Windows系统串口调试工具。 picocom 效果上类似 minicom 的精简版,设置比较简单,还可以有背景颜色。...PC上的串口一般是ttyS,板子上Linux的串口一般叫做ttySAC; 串口权限问题 临时调试解决 在使用串口进行通信时,经常需要使用指令来赋予用户读写的权限 $ sudo chmod 777 /dev...查看linux所有用户 使用 /etc/passwd 文件 使用任何一个像 cat、more、less 等文件操作命令来打印 Linux 系统上创建的用户列表。.../etc/passwd 是一个文本文件,其中包含了登录 Linux 系统所必需的每个用户的信息。
三、进程等待 3.1、进程等待的必要性 1、之前讲过,子进程退出,父进程如果不管不顾,就可能造成‘僵尸进程’的问题,进而造成内存泄漏。...4、父进程通过进程等待(wait)的方式,回收子进程资源,获取子进程退出信息 3.2、进程等待的方法 3.2.1、wait方法 wait方法里的参数为输出型参数,可以设置为NULL。...调用wait函数父进程默认进行阻塞等待,会等待任意一个子进程退出。等待成功,wait会返回子进程的pid,等待失败返回小于0的值。 ...int变量的地址,可以查看子进程的退出码), options参数设置为0表示阻塞等待,设置为宏 WNOHANG表示非阻塞等待。...阻塞等待时父进程会阻塞在waitpid这里一直等待子进程返回,非阻塞等待采用轮询的方法查看子进程的退出信息,在轮询的间隙父进程可以继续做别的工作。
缓冲区的理解 一. C接口打印两次的现象 二. 理解缓冲区问题 为什么要有缓冲区 缓冲区刷新策略的问题 所说的缓冲区在哪里?指的是什么缓冲区? 三. 解释打印两次的现象 四. 模拟实现 五....缓冲区与OS的关系 一....理解缓冲区问题 缓冲区本质就是一段内存 那么既然有了本质前提,那么就有这几个方面要思考: 缓冲区是谁申请的? 缓冲区属于谁? 为什么要有缓冲区?...而这个过程中,顺丰这块开辟的空间就相当于缓冲区。 那么缓冲区的意义是什么呢?——节省进程进行数据IO的时间。这也就回答了第三个问题为什么要有缓冲区。...,就比如我们常用的快捷键:ctrl + s 总结: 因此以上我们所提到的缓冲区有两种:用户缓冲区和内核缓冲区,用户缓冲区就是语言级别的缓冲区,对于C语言来说,用户缓冲区就在FILE结构体中,其他的语言也类似
---- 前言 进程 创建后,需要对其进行合理管理,光靠 OS 是无法满足我们的需求的,此时可以运用 进程 控制相关知识,对 进程 进行手动管理,如创建 进程、终止 进制、等待 进程 等,其中等待 进程...使用 _exit() 时,并没有任何语句输出 原因: exit() 是对 _exit() 做的封装实现 _exit() 就只是单纯的退出程序 而 exit() 在退出之前还会做一些事,比如冲刷缓冲区...,再调用 _exit() 程序中输出语句位于输出缓冲区,不冲刷的话,是不会输出内容的 ---- 3、进程等待 僵尸进程 是一个比较麻烦的问题,如果不对其做出处理,僵尸进程 就会越来越多,导致 内存泄漏...和 标识符 占用问题 3.1、等待原因 子进程运行结束后,父进程没有等待并接收其退出码和退出状态,OS 无法释放对应的 内核数据结构+代码和数据,出现 僵尸进程 为了避免这种情况的出现,父进程可以通过函数等待子进程运行结束...---- 总结 以上就是关于 Linux进程控制(创建、终止、等待) 的相关知识了,我们学习了 子进程 是如何被创建的,创建后又是如何终止的,以及 子进程 终止 父进程 需要做些什么,有了这些知识后,
重要声明 该培训中提及的技术只适用于合法CTF比赛和有合法授权的渗透测试,请勿用于其他非法用途,如用作其他非法用途与本文作者无关 今天我们来说一下关于Linux缓冲区溢出的东西 Linux缓冲区溢出...环境变量攻击 在Linux中,程序在内存中的分布和Windows的差不多 但是也有自己的特色 ? 命令行参数和环境变量都是存储在高地址上 只要我们通过溢出能操纵这些数据 就可以干很多事 2.
简介 嵌入式Linux下串口编程与Linux系统下的编程没有什么区别,系统API都是一样的。...嵌入式设备中串口编程是很常用的,比如会对接一些传感器模块,这些模块大多是RS232或者RS485接口,对于软件层面上来说,RS232与RS48区别不大。...RS232与RS485在使用上的区别,RS232是全双工的,只能对接一个设备串口设备。RS485是半双工的总线协议,一般可以挂多个传感器设备,半双工的意思是同时只能有一个设备向串口发数据。...用到的API函数 函数 说明 open 打开设备,用于打开串口设备 fcntl 修改设备描述符属性参数 isatty 检测打开的描述符是否指向一个终端 tcgetattr 用来获取串口终端参数 cfmakeraw...将终端设置为原始模式,该模式下所有的输入数据以字节为单位被处理 tcflush 用于清空输入、输出缓冲区 tcsetattr 设置串口终端参数 read 读取数据 write 写数据 close 关闭串口设备
预备知识 我们介绍重定向从一个函数开始: 我们从close函数开始,close函数的参数是fd,也就是文件描述符,结合Linux中万物皆文件的思想,如果我们我们往显示器这个文件输出东西,把该文件关了是不是就打印不出来了...\n"); } dup2(fd,1); printf("Hello linux!\n"); fprintf(stdout,"Hello world!...\n"); } dup2(fd,1); printf("Hello linux!\n"); fprintf(stdout,"Hello world!...缓冲区怎么做的? 缓冲区是一块空间,但是本质上,缓冲区实际上是结构体,为什么我这么说呢?...缓冲区不止一个,每个打开的文件都有对应的缓冲区,每个打开的文件都有自己对应的_fileno!!这和我们之前所认为的缓冲区的差别是非常大的。
环境:centos7.6,腾讯云服务器 Linux文章都放在了专栏:【Linux】欢迎支持订阅 相关文章推荐: 【Linux】冯.诺依曼体系结构与操作系统 【Linux】进程理解与学习Ⅰ-进程概念...【Linux】进程理解与学习Ⅱ-进程状态 【Linux】进程理解与学习Ⅲ-环境变量 【Linux】进程理解与学习Ⅳ-进程地址空间 浅谈Linux下的shell--BASH 【Linux】进程优先级...我们在Linux下可以通过echo $?指令查看最近的进程的退出码。 ...实际上两者的共同点就是,两者都是当执行到该语句时,就会终止进程,唯一的区别就在于exit在终止进程之前会刷新缓冲区,而_exit则是直接结束进程。...阻塞式等待 将waitpid的第三个参数设置为0,就表示阻塞式等待。
,linux每个文件都有自己的文件内核级缓冲区,也就是一段内存空间,但它究竟有什么用?...其实在语言层面,对每个文件也有个语言级缓冲区,也称用户级缓冲区。它的主要作用就是,解耦和提高效率。 ...我们在打印数据到显示器时,大概率不会只打印一行,会打印很多数据,我们不可能每次读到一行要打印的数据就调用系统调用接口去打印到文件中,因为调用系统调用是有成本的,每次遇到需要打印的数据就让它进入语言级缓冲区...,根据刷新策略来决定什么时候调用系统调用来刷新到内核级缓冲区,再由内核级缓冲区刷新到文件中。...满了才刷新,普通文件 还有特殊情况,当进程退出或者使用fflush接口也可以立刻刷新缓冲区。
调用_exit 所以exit比_exit多做了一层最重要的工作就是刷新缓存,我们还可以得出另一个结论就是:缓冲区绝对不在内核区!!...——>因为如果在内核区的话,系统调用的_exit在终止的时候也必然会把缓冲区刷新一下,因为现代操作系统不做任何浪费时间和空间的事情,所以肯定不是由内核维护缓存区,而是由用户区在维护!!...(_exit压根看不到缓冲区,所以这个工作只能有exit去完成) 2.2 异常中止 用退出码可以告诉父进程自己的执行情况,那如果是异常中止了呢??...也就是系统调用会卡住,会被链接到子进程的一个阻塞队列中等待。...3、int options 0:代表阻塞等待的方式,就是子进程没结束系统调用就一直等 WNOHANG: 代表非阻塞轮询的等待方式,若pid指定的子进程没有结束,则waitpid()函数返回0,不予以等待
并且本文会加深一下缓冲区的理解和重定向的理解。 那么话不多说,进入正题吧。...加深理解 我们通过一个函数,sprintf来介绍缓冲区,因为sprintf是C语言的函数,而在C语言里面这个函数我们基本上没有使用过,所以学习Linux也有一定程度上介绍了C语言的调用底层的函数。...,每写入一次,就sleep一秒,然后刷新缓冲区,这样的结果,是将fp指向的缓冲区写入动态的字符串: 这个过程是动态的,但是如果我们将fflush去掉,并且在buffer数组里面不写入\n,我们看到的结果就是...log.txt里面是等程序运行完,也就是进程终止之后,强制刷新缓冲区,从而导致的数据刷新出来: 这个点从另一个点,告诉了我们用户级别,也就是语言层面的缓冲区的存在。...而使用函数fllush 转义字符\n都是可以刷新该缓冲区,数据刷新之后,由OS将将数据从内核级别的缓冲区刷新到磁盘里面去。 也算是简单的复习了一下,今天的重点是stderr。
领取专属 10元无门槛券
手把手带您无忧上云