mysql与串口通信_虚拟机串口与主机串口通信·小程序(下)

上次说到的,不能做到实时通信。那么开两个进程就可以了,一个用来监听是否有消息传来,一个用来等待用户输入。那么,先来复习一下进程的相关概念。

进程结构

linux中进程包含PCB(进程控制块)、程序以及程序所操纵的数据结构集,可分为“代码段”、“数据段”和“堆栈段”。

进程状态

运行状态R(TASK_RUNNING)

可中断睡眠状态S(TASK_INTERRUPTIBLE)

不可中断睡眠状态D(TASK_UNINTERRUPTIBLE)

暂停状态T(TASK_STOPPED或TASK_TRACED)

僵死状态Z(TASK_ZOMBIE)

退出状态X(TASK_DEAD)

ps -aux 查看进程信息,可以看到各进程的状态:

089c436026a03593c5c4a0353cca3e6d.png

init进程

所有进程的父进程

init进程绝不会终止。

它是一个普通的用户进程(与交换进程不同,它不是内核中的系统进程),但是它以超级用户特权运行。

获取进程标识

#include < sys/types.h>

#include < unistd.h>

pid_t getpid(void); 返回:调用进程的进程I D

pid_t getppid(void); 返回:调用进程的父进程I D

uid_t getuid(void); 返回:调用进程的实际用户I D

uid_t geteuid(void); 返回:调用进程的有效用户I D

gid_t getgid(void); 返回:调用进程的实际组I D

gid_t getegid(void); 返回:调用进程的有效组I D

fork系统调用

#include < sys/types.h>

#include < unistd.h>

pid_t fork(void);

返回:子进程中为0,父进程中为子进程I D,出错为-1

注意:
1、使用fork函数得到的子进程从父进程的继承了整个进程的地址空间,包括:

进程上下文、进程堆栈、内存信息、打开的文件描述符、信号控制设置、进程优先级、进程组号、当前工作目录、根目录、资源限制、控制终端等。

2、子进程与父进程的区别在于:

1)父进程设置的锁,子进程不继承

2)各自的进程ID和父进程ID不同

3)子进程的未决告警被清除;

4)子进程的未决信号集设置为空集。

3、fork系统调用之后,父子进程将交替执行。

4、如果父进程先退出,子进程还没退出。那么子进程的父进程将变为init进程。(注:任何一个进程都必须有父进程)

5、如果子进程先退出,父进程还没退出,那么子进程必须等到父进程捕获到了子进程的退出状态才真正结束,否则这个时候子进程就成为僵进程。(这是不好的,这样子进程会一直占用内存资源)

解决办法:

1)wait函数:使父进程阻塞,直到一个子进程结束或者该进程收到一个指定信号为止。(但是,这样不好)

2)signal(SIGCHLD,SIG_IGN)。表示父进程忽略SIGCHLD,该信号是子进程退出的时候向父进程发出的,由init进程收。

测试

接下来,可以继续我们上次的小程序了。

#include < stdio.h>

#include < sys/types.h>

#include < signal.h>

#include " port.h"

#include " readConfig.h"

// 1、主机与虚拟机

int main()

{

int fd,pid,child_id;

char filename[20] = "serial.cfg";

char recbuf[100] = "";

char sendbuf[100] = "";

struct t_port port = {0};

//从文件获取配置信息

getMsg(filename,&port);

//串口初始化

fd = portInit(port.devname,port.speed,port.data,port.parity,port.stop);

//主机与虚拟机串口通信

pid = fork();

if(pid == -1)

{

perror("create process");

return 1;

}

else if(pid == 0) //子进程 接收消息

{

child_id = getpid();

while(read(fd,recbuf,100)>0) //这里不能用strlen。因为开始strlen(recbuf)=0

{

if(strcmp(recbuf,"") != 0)

{

printf("receive msg: %s\n",recbuf);

putchar('$');

fflush(stdout);

}

memset(recbuf,0,100);

}

}

else //(主)父进程 发送消息

{

printf("$");

while(1)

{

memset(sendbuf,0,100);

scanf("%s",sendbuf);

if(strcmp(sendbuf,"over") == 0) //但是,此时,子进程未结束,还在后台运行

{

break;

}

if(write(fd,sendbuf,strlen(sendbuf)) > 0)

{

printf("$");

}

}

}

close(fd);

return 0;

}

//2、虚拟机两串口

/*

int main(int argc,char *argv[])

{

int fd,pid;

char receivebuf[100] = "";

char sendbuf[100] = "";

if(argc != 2)

{

printf("format error!\n");

return 1;

}

if( strcmp(argv[1],"ttyS0")==0)

{

fd = portInit("/dev/ttyS0",115200,8,0,1);

}

else if(strcmp(argv[1],"ttyS1")==0)

{

fd = portInit("/dev/ttyS1",115200,8,0,1);

}

else

{

printf("format error!\n");

return 1;

}

pid = fork();

if(pid == -1)

{

perror("create process");

return 1;

}

else if(pid == 0) //子进程

{

//接收消息

while(read(fd,receivebuf,sizeof(receivebuf)) > 0)

{

if(strcmp(receivebuf,"") != 0)

{

printf("receive msg : %s\n",receivebuf);

}

memset(receivebuf,0,100);

}

}

else //父进程

{

//发送消息

while(1)

{

memset(sendbuf,0,100);

scanf("%s",sendbuf);

if(strcmp(sendbuf,"-over") == 0)

{

break;

}

write(fd,sendbuf,strlen(sendbuf));

printf("send OK\n");

}

}

close(fd);

return 0;

}

*/

运行结果:

75ea1af67a42768bb0fbf263d1f2ca20.png


发现问题了没?对的。父进程会先死。

程序运行时:

b7a3c021a7df327dfee9af7503bbbbf4.png

程序结束时:

38291d40f6ef4714be7239c4261d92e0.png

如何解决呢?下次说~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/371153.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

浅谈我所见的CSS命名风格

在两年工作中&#xff0c;总结一下我所见的css命名风格。 1.单一class命名 .header {width: 500px; } .item {text-indent: 20%; } 优点&#xff1a;简单&#xff0c;渲染效率高。 缺点&#xff1a;零散&#xff0c;没有模块化。 2. 后代选择器class命名 .header .item a {font…

Java规范请求中的数字

你们都了解Java社区流程 &#xff08;JCP&#xff09;&#xff0c;不是吗&#xff1f; JCP是为Java技术开发标准技术规范的机制。 任何人都可以注册该站点并参与对Java规范请求&#xff08;JSR&#xff09;的审查和提供反馈&#xff0c;并且任何人都可以注册成为JCP成员&#x…

ORACLE MOS 翻译

http://blog.csdn.net/msdnchina/article/details/53174196转载于:https://www.cnblogs.com/zengkefu/p/6665950.html

自从我这样撸代码以后,公司网页的浏览量提高了107%!

欢迎大家前往腾讯云 社区&#xff0c;获取更多腾讯海量技术实践干货哦~ 本文由腾讯IVWEB团队发表于云 社区专栏 作者&#xff1a;yangchunwen HTTP协议是前端性能乃至安全中一个非常重要的话题&#xff0c;最近在看《web性能权威指南(High Performance Browser Networking)》&a…

python数列分段_按范围分段的Python数组

首先&#xff0c;定义你的“极”数第二&#xff0c;根据这些“极”数生成间隔第三&#xff0c;定义尽可能多的列表。在然后&#xff0c;对于每个间隔&#xff0c;扫描列表并在相关列表中添加属于该间隔的项代码&#xff1a;source [1, 4, 7, 9, 2, 10, 5, 8]poles (0,3,6,25)…

51nod 1278 相离的圆

基准时间限制&#xff1a;1 秒 空间限制&#xff1a;131072 KB 分值: 10 难度&#xff1a;2级算法题 平面上有N个圆&#xff0c;他们的圆心都在X轴上&#xff0c;给出所有圆的圆心和半径&#xff0c;求有多少对圆是相离的。例如&#xff1a;4个圆分别位于1, 2, 3, 4的位置&…

让我们将包变成模块系统!

使用构建系统将许多项目分为模块/子项目&#xff08; Maven &#xff0c; Gradle &#xff0c; SBT …&#xff09;&#xff1b; 编写模块化代码通常是一件好事。 将代码分为构建模块主要用于&#xff1a; 隔离代码部分&#xff08;减少耦合&#xff09; api / impl拆分 仅将…

R语言日期的表示和运算(详细总结)

1、取出当前日期 Sys.Date() [1] "2014-10-29" date() #注意&#xff1a;这种方法返回的是字符串类型 [1] "Wed Oct 29 20:36:07 2014" 2、在R中日期实际是double类型&#xff0c;是从1970年1月1日以来的天数 typeof(Sys.Date()) [1] "double" …

html高度塌陷问题解决

高度塌陷的问题&#xff1a; 当开启元素的BFC以后&#xff0c;元素将会有如下的特性 1 父元素的垂直外边距不会和子元素重叠 开启BFC的元素不会被浮动元素所覆盖 开启BFC的元素可以包含浮动的子元素 如何开启元素的BFC 设置元素浮动 设置元素绝对定位 …

java空格键_Java KeyPressed-如果其他键也太旧,则无法检测是否按下了空格键

如标题所示&#xff0c;在我的Java游戏中&#xff0c;无法检测是否同时按下空格键和其他键。例如&#xff0c;空格键是射击键&#xff0c;而箭头键则使玩家移动。如果我按下向上箭头键&#xff0c;向左箭头键和空格键&#xff0c;那么它应该向左上方发射子弹。但是&#xff0c;…

How to fix the bug “Expected required, optional, or repeated.”?

参考&#xff1a;https://github.com/tensorflow/models/issues/1834 You need to download protoc version 3.3 (already compiled). Used protoc inside bin directory to run this command like this:tensorflow$ mkdir protoc_3.3tensorflow$ cd protoc_3.3tensorflow/prot…

立面设计模式–设计观点

在上一篇文章中&#xff0c;我们描述了适配器设计模式 。 在今天的文章中&#xff0c;我们将展示另一种类似的“四结构帮派”模式 。 顾名思义&#xff0c;结构模式用于从许多不同的对象形成更大的对象结构。 外观模式就是这样一种模式&#xff0c;它为系统内的一组接口提供了简…

Java第三次作业 1502 马 帅

《Java技术》第三次作业 &#xff08;一&#xff09;学习总结 1.书中对面向对象封装性的定义为&#xff1a;指把对象的属性和行为看成一个密不可分的整体&#xff0c;把不需要让外界知道的信息隐蔽起来。简单来说&#xff0c;就是定义的一些对象&#xff0c;只有在本类中才可以…

sass运算

sass具有运算的特性&#xff0c;可以对数值型的Value(如&#xff1a;数字、颜色、变量等)进行加减乘除四则运算。 请注意运算符前后请留一个空格&#xff0c;不然会出错。 scss.style css.style 本文转载于:猿2048https://www.mk2048.com/blog/blog.php?idiij12j&titles…

163 coremail_Icoremail企业邮箱

高速稳定iCoremail企业邮箱于国内外多个网络运营商的主干网数据中心放置邮件服务器&#xff0c;同时采用我司自主研发的Coremail电子邮件系统&#xff0c;从多方面保障了用户的流畅体验。安全可靠iCoremail企业邮箱使用欧洲最大的反病毒安全提供商的Sophos反病毒系列产品&#…

jquery-基础事件[下]

<script>$(function () {mouseover mouseout mouseenter mouseleave的区别$(div).mouseover(function () {$(this).css(background, red);}).mouseout(function () {$(this).css(background, green);});$(div).mouseenter(function () {$(this).css(background, red);}).…

JavaOne 2012:NetBeans.Next –未来路线图

我从Continental Ballroom 4和一个NetBeans主题&#xff08; 项目Easel &#xff09;到Continental Ballroom 5&#xff0c;走了必要的几个步骤&#xff0c;以查看另一个面向NetBeans的演示文稿&#xff1a;“ NetBeans.Next –未来路线图”。 Ashwin Rao发起了“羽毛之鸟”&am…

LeetCode day30

LeetCode day30 害&#xff0c;昨天和今天在搞数据结构的报告&#xff0c;后面应该也会把哈夫曼的大作业写上来。 今天认识认识贪心算法。(&#xff61;&#xff65;∀&#xff65;)&#xff89; 2697. 字典序最小回文串 给你一个由 小写英文字母 组成的字符串 s &#xff0c;…

html注册表

这是第一次使用html写一个简单的注册表&#xff08;有不对的地方希望大家可以帮我指出来谢谢?&#xff09; <!DOCTYPE html><html><head> <title>木木音乐网第一次注册表</title></head><body><h2>使用手机号码注册</…

C#复习正则表达式

由于前段时间为了写工具学的太J8粗糙 加上最近一段时间太浮躁 所以静下心来复习 一遍以前学的很弱的一些地方1 委托 public delegate double weituo(double a, double b);public static double test1(double a,double b){return a * b;}public static double test2(double a,…