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

进程结构

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

进程状态

运行状态R(TASK_RUNNING)

可中断睡眠状态S(TASK_INTERRUPTIBLE)

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

暂停状态T(TASK_STOPPED或TASK_TRACED)

僵死状态Z(TASK_ZOMBIE)

退出状态X(TASK_DEAD)

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

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;

}

*/

运行结果:

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

程序运行时:

程序结束时:

如何解决呢?下次说~

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

  1. Node.js+MySQL开发的B2C商城系统源码+数据库(微信小程序端+服务端),界面高仿网易严选商城

    下载地址:Node.js+MySQL开发的B2C商城系统源码+数据库(微信小程序端+服务端) NideShop商城(微信小程序端) 界面高仿网易严选商城(主要是2016年wap版) 测试数据采集自网易 ...

  2. android 串口通信_使用UART与ZYBO进行通信常用外设设计方案

    作者:Wilson Qiu,Xilinx工程师 常用外设设计 使用UART与ZYBO进行通信 ZYNQ学习过程中一个重要环节是进行调试,当然在SDK中进行调试时,设置断点进行单步调试非常高效.但是ZY ...

  3. FPGA 串口中断_一个严谨的STM32串口DMA发送amp;接收(1.5Mbps波特率)机制

    昨天分享的<嵌入式大杂烩读者福利:第一期>大家有去抽奖吗,没抽的可参与抽奖,碰碰运气.我最喜欢抽奖了,还记得前几个月疫情严重时期连抽中了3包口罩,真刺激,哈哈.之后多多安排抽奖,敬请期待. ...

  4. mysql 体系结构不匹配_指定的DSN包含驱动程序和应用程序之间的体系结构不匹配...

    当Access的位版本(32 vs 64)不匹配时,尝试从MS-Access连接到MySQL数据库时,会出现完全相同的错误 您正在使用的ODBC驱动程序的位版本 用于设置它的ODBC管理器的位版本. ...

  5. 虚拟机ping不通本地_虚拟机ping不通主机怎么解决

    很多小伙伴在使用电脑中会碰到各种问题,有小伙伴的虚拟机ping不通主机,这个问题是比较麻烦的,那怎么解决呢,西西小编来为大家介绍. 虚拟机ping不通主机怎么解决 一.引出问题 1.查看虚拟机IP地址 ...

  6. 全云端万能小程序_百搜全云端万能门店小程序v4.0.13五端独家2次开发升级独立版...

    百搜全云端五端万能小程序独立版简介: 包含:百度小程序,支付宝小程序,微信小程序,头条小程序,QQ小程序,H5,PC商城. 功能:支持小程序一键上传极速审核,对接微信开放平台发布使用,也可以单独使用开 ...

  7. 通信录管理系统--我的第一个C++小程序(源码可用)

    java转c++的第三天,写完了人生中的第一个c++小程序,啥也不说了,直接贴源码: 注释里面是我写的时候的一些思考和写完之后的经验教训,给自己和其他初学c++的猿友们加油! //教训: //①(已改 ...

  8. api demo 京东商品详情_自制,简易仿京东微信小程序demo

    学习微信小程序一段时间,自己仿照京东小程序做了几个demo页面,分享给大家看看 其中几个效果图如下: 介绍一下事先准备的事情 前期部署 ****项目命名规范**** 1.JS用驼峰法命名 2.css中 ...

  9. c# wifi串口通信_在C#中实现串口通信的方法

    通常,在C#中实现串口通信,我们有四种方法: 第一:通过MSCOMM控件这是最简单的,最方便的方法.可功能上很难做到控制自如,同时这个控件并不是系统本身所带,所以还得注册,不在本文讨论范围.可以访问h ...

最新文章

  1. 我对于js注入的理解
  2. 阿里云面向企业效率的云上产品全解析——云呼叫中心
  3. Vue SPA 打包优化实践
  4. TD-SCDMA向HSPA+的演进
  5. Only Available on April 1st
  6. vue用公共组件页面传值_微信小程序页面传值、组件间通信总结
  7. Element.prototype.addDependent will call addAggregation
  8. Mbp,一个用于学习.net core的开发框架
  9. 电脑怎么结束进程_深刻了解windows系统的任务管理器,电脑高手的成长之路
  10. wifi情况下使用fiddler_钢筋网片在什么情况下使用?
  11. linux远程开启不挂起的服务
  12. 最优化算法——常见优化算法分类及总结
  13. 路由器重温——MP配置管理
  14. Qt编写安防视频监控系统46-视频存储
  15. 软件测试需要学什么?软件测试技能图谱
  16. 项目管理师、系统分析师和系统架构师的关系与区别
  17. JetPack 组件总结
  18. Praat脚本-000 | 实用的Praat脚本总索引
  19. Python爬虫:获取糗事百科笑话
  20. python自定义html_Python 第十二篇:HTML基础

热门文章

  1. 自定义函数_python3基础07函数(自定义)
  2. 新手上路之django项目开发(二)-----引入静态文件
  3. 本科计算机应用水平,湖南工程学院全日制非计算机专业本科生参加湖南省计算机应用水平等级考试的规定...
  4. linux版本photoshop,在linux上使用ps(转载)
  5. java 监控 native 内存_JVM NativeMemoryTracking 分析堆外内存泄露
  6. 浅谈离线化方案的探索,跨容器
  7. java光标移动函数_文件内光标的移动 函数基础 定义函数的三种形式 函数的返回值 调用方式...
  8. jsp输出所有请求头的名称
  9. 优秀网页设计:带给你灵感的联系页面设计
  10. html基础-html简介-第一个网页(1)