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,一经查实,立即删除!

相关文章

Java规范请求中的数字

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

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

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

立面设计模式–设计观点

在上一篇文章中&#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…

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

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

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,…

在vue中安装使用vux

最近因为的工作的原因在弄vue&#xff0c;从后端弄到前端之前一直用js&#xff0c;现在第一次接触vue感觉还挺有意思的&#xff0c;就是自己太菜了&#xff0c;这个脑子呀。。。。不太够用。。。。。页面设计用了一个叫vux的东西&#xff0c;vux可以提供一些组件&#xff0c;用…

Zabbix全方位告警接入-电话/微信/短信都支持

http://www.cnblogs.com/baidu-gaojing/p/5128035.html 百度告警平台地址&#xff1a; http://gaojing.baidu.com 联系我们&#xff1a; 邮箱&#xff1a;gaojingbaidu.com 电话&#xff1a;13924600771 QQ群&#xff1a;183806029 对于使用zabbix的用户&#xff0c;要接入百度…

Spring MVC定制用户登录注销实现示例

这篇文章描述了如何实现对Spring MVC Web应用程序的自定义用户访问&#xff08;登录注销&#xff09;。 作为前提&#xff0c;建议读者阅读这篇文章 &#xff0c;其中介绍了一些Spring Security概念。 该代码示例可从Spring-MVC-Login-Logout目录中的Github获得。 它从带有注释…

HTML5与CSS3权威指南笔记案例1

第1章 <!DOCTYPE html> <meta charset "UTF-8"> <title> Search </title> <form> <p><label>Search&#xff1a;<input name"search" autofocus></label> </p> </form> <!DOCTYPE&…

java循环的概念_Java数据结构之循环队列简单定义与用法示例

本文实例讲述了Java数据结构之循环队列简单定义与用法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;一、概述&#xff1a;1、原理&#xff1a;与普通队列的区别在于循环队列添加数据时&#xff0c;如果其有效数据end maxSize - 1(最大空间)的话&#xff0c;end指针…

sass变量

sass变量用法 1、sass变量必须以$符开头&#xff0c;后面紧跟着变量名 2、变量值和变量名之间就需要使用冒号(:)分隔开&#xff08;就像CSS属性设置一样&#xff09; 3、如果值后面加上!default则表示默认值 默认变量 sass的默认变量&#xff1a;仅需要在值后面加上!defaul…

根据您的命令-命令设计模式

命令设计模式是一种广为人知的设计模式&#xff0c;它属于行为设计模式&#xff08;“四人帮”的一部分&#xff09;。 顾名思义&#xff0c;它与应用程序中的动作和事件有关。 问题陈述&#xff1a; 假设有一个网页将在其中包含多个菜单的情况。 编写此代码的一种方法是使条件…

用js和jQuery做轮播图

Javascript或jQuery做轮播图 css样式 <style> a{ text-decoration:none; } .naver{ width: 100%; position:relative; }.images{position:relative;width: 100%;height: 400px; } .images img{position:absolute;left: 0;top: 0;width: 100%;height: 400px;opacity: 0;fi…

【开发调试】谷歌浏览器中调试移动网页和测试网速下页面效果

、 今天有幸给大家分享一下谷歌浏览器针对移动网页测试的技巧&#xff0c;主要是最近做个微信公共号网站。所以就要对页面测试拉。移动网页我们最长测得就是各种手机大小的页面效果和出现网络问题的效果展示。 今天就简单分享下在谷歌浏览器测试页面的适配和网速限制展示。…

拼多多分享好友砍价Java实现_拼多多砍价怎么分享到朋友圈 砍价发到微信朋友圈方法...

拼多多是一款电商社交的共享式购物平台&#xff0c;现在还推出了砍价的活动&#xff0c;只要邀请好友砍价&#xff0c;你就以最低的价格购买商品&#xff0c;还可以可能是免费拿到&#xff0c;那么今天小编就给大家讲讲如何将自己的砍价信息分享到微信朋友圈。首先下载手机拼多…

通过6个简单的步骤在Windows上运行Apache Hive

注意 &#xff1a;您需要安装cygwin才能运行本教程&#xff0c;因为Hadoop&#xff08;Hive需要&#xff09;需要cygwin才能在Windows上运行。 至少&#xff0c;系统中必须存在Basic&#xff0c;Net&#xff08;OpenSSH&#xff0c;tcp_wrapper软件包&#xff09;和与安全相关的…

vue 环境的搭建及初始化项目

其实超级简单&#xff0c;虽然网上很多&#xff0c;但是我顺便记录下相当于做笔记吧 1nodejs 的安装&#xff0c; 在node官网下载&#xff0c;点击安装&#xff0c;安装的时候最好选择路径在d盘 2设置环境变量 我的电脑-->属性-->系统环境变量- 系统变量新增一个NODE…

Java堆转储:您可以完成任务吗?

如果您像我一样对Java性能充满热情&#xff0c;那么堆转储分析对您来说应该不是一个谜。 如果是这样&#xff0c;那么好消息是您将有机会提高您的Java故障诊断技能和JVM知识。 JVM现已发展到今天&#xff0c;与旧的JDK 1.0 – JDK 1.4天相比&#xff0c;今天生成和分析JVM堆转…