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.pswp.cn/news/371153.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/371153.shtml
英文地址,請注明出處:http://en.pswp.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,…