0513_IO7

練習1:

? ? ?使用消息隊列實現的2個終端之間的互相聊天 并使用信號控制消息隊列的讀取方式: 當鍵盤按ctrl+c的時候,切換消息讀取方式,一般情況為讀取指定編號的消息,按ctrl+c之后,指定的編號不讀取,讀取其他所有編號的消息

//聊天一號機位
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
#include <semaphore.h>
#include <wait.h>
#include <signal.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <semaphore.h>
#include <sys/msg.h>
#include <sys/shm.h>
#include <sys/un.h>
//定義結構體
struct msgbuf{long mtype;char mtext[128];
};
int msgid;
int signal_l=0;//ctrl+c改變的變量信息編號
int s=0;//用來判斷切換回去的變量
void handle(int sig){if(s==0){signal_l=020000;s=1;}else if(s!=0){signal_l=0;s=0;}
}
//用于讀取的線程
void *ltread(void *arg){signal(SIGINT,handle);struct msgbuf rbuf;while(1){memset(&rbuf,0,sizeof(rbuf));//初始化結構體msgrcv(msgid,&rbuf,128,2,signal_l);//讀取消息隊列中的消息printf("讀取到的消息為%s\n",rbuf.mtext);}
}                                                                                                                                                                      
int main(int argc, const char *argv[])
{//調用函數ftok,獲取訪問同一個消息隊列的秘鑰key_t key;if((key=ftok("liantianle",100))==EOF){perror("ftok");return -1;}//根據秘鑰創建消息隊列/根據秘鑰訪問一個已經存在的消息隊列if((msgid=msgget(key,IPC_CREAT|0666))==EOF){perror("msgget");return -1;}//創建并運行一個線程pthread_t thread;if((thread=pthread_create(&thread,NULL,ltread,NULL))!=0){perror("pthread_create");return -1;}struct msgbuf wbuf;signal(SIGINT,SIG_IGN);while(1){memset(&wbuf,0,sizeof(wbuf));//初始化結構體wbuf.mtype=1;//確定消息編號printf("1號輸入:");fgets(wbuf.mtext,128,stdin);//直接讀取終端輸入,避免了scanf不吸收空格的影響msgsnd(msgid,&wbuf,strlen(wbuf.mtext),0);//將消息寫入消息隊列,以阻塞的形式}return 0;
}// 聊天2號機位                                                                                                                                                                  
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
#include <semaphore.h>
#include <wait.h>
#include <signal.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <semaphore.h>
#include <sys/msg.h>
#include <sys/shm.h>
#include <sys/un.h>
//定義結構體
struct msgbuf{long mtype;char mtext[128];
};
int msgid;
int signal_l=0;//ctrl+c改變的變量信息編號
int s=0;//用來判斷切換回去的變量
void handle(int sig){if(s==0){signal_l=020000;s=1;}else if(s!=0){signal_l=0;s=0;}                                                                                                                                                                                                                                                     
}
//用于讀取的線程
void *ltread(void *arg){signal(SIGINT,handle);struct msgbuf rbuf;while(1){memset(&rbuf,0,sizeof(rbuf));//初始化結構體msgrcv(msgid,&rbuf,128,1,signal_l);//讀取消息隊列中的消息printf("讀取到的消息為%s\n",rbuf.mtext);}
}
int main(int argc, const char *argv[])
{//調用函數ftok,獲取訪問同一個消息隊列的秘鑰key_t key;if((key=ftok("liantianle",100))==EOF){perror("ftok");return -1;}//根據秘鑰創建消息隊列/根據秘鑰訪問一個已經存在的消息隊列if((msgid=msgget(key,IPC_CREAT|0666))==EOF){perror("msgget");return -1;}//創建并運行一個線程pthread_t thread;if((thread=pthread_create(&thread,NULL,ltread,NULL))!=0){perror("pthread_create");return -1;}struct msgbuf wbuf;signal(SIGINT,SIG_IGN);while(1){memset(&wbuf,0,sizeof(wbuf));//初始化結構體wbuf.mtype=2;//確定消息編號printf("2號輸入:");fgets(wbuf.mtext,128,stdin);//直接讀取終端輸入,避免了scanf不吸收空格的影響msgsnd(msgid,&wbuf,strlen(wbuf.mtext),0);//將消息寫入消息隊列,以阻塞的形式}return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/11547.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/11547.shtml
英文地址,請注明出處:http://en.pswp.cn/web/11547.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

孩子多大可以接觸python?學習python的好處

孩子接觸Python的年齡并沒有明確的界限&#xff0c;一般來說&#xff0c;6歲以上的孩子可以開始學習Python編程。雖然Python是一門高級編程語言&#xff0c;但它的語法簡單易懂&#xff0c;適合初學者入門。通過學習Python編程&#xff0c;孩子可以培養邏輯思維、創造力和解決問…

電商秒殺系統設計

業務流程 系統架構 系統挑戰 高并發:秒殺活動會在短時間內吸引大量用戶,系統需要能夠處理高峰時期的大量并發請求 庫存同步:在秒殺中,面臨的一個嚴重系統挑戰是如何確保在數以萬計的用戶同時搶購有限的商品時,如何正確、實時地扣減庫存,以防止超賣現象。 防止惡意搶購和…

前端 JS 經典:JS 基礎類型和 typeof

前言&#xff1a;JS 基礎類型就 8 種&#xff0c;這是官方確定的&#xff0c;毋庸置疑。其中原始類型 7 種&#xff0c;對象類型 1 種。而 typeof 關鍵字是用來判斷數據是屬于什么類型的。 1. 原始類型 Number、Boolean、String、BigInt、symbol、Undefined、null typeof 18…

貓頭虎分享已解決Error || ERROR: Failed building wheel for XXX

博主貓頭虎的技術世界 &#x1f31f; 歡迎來到貓頭虎的博客 — 探索技術的無限可能&#xff01; 專欄鏈接&#xff1a; &#x1f517; 精選專欄&#xff1a; 《面試題大全》 — 面試準備的寶典&#xff01;《IDEA開發秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鴻蒙》 …

python設計模式---觀察者模式

觀察者模式是一種行為設計模式&#xff0c;用于定義對象之間的一對多依賴關系&#xff0c;當一個對象的狀態發生變化時&#xff0c;所有依賴它的對象都會得到通知并自動更新。 from abc import ABC, abstractmethod from typing import Listclass Observable:def __init__(sel…

系統定時器(SysTick)

介紹SysTick SysTick結構框圖 時鐘選擇 計數器部分 中斷部分 工作流程 相關寄存器 配置流程 相關庫函數

centos無法tab補全至文件

很奇怪的需求&#xff1a;redhat 7.9版本用cd 只能到目錄&#xff0c;無法到文件 我個人認為不是個問題&#xff0c;但是甲方需求&#xff0c;你懂的 首先&#xff0c;我們要搞清楚tab補全功能的包bash-completion是否安裝&#xff0c;這里肯定是安裝了&#xff0c;不過還是看…

使用vscode時快速生成console.log()

前言&#xff1a;在使用vscode開發進行調試時&#xff0c;我們經常要用到console.log()來調試代碼&#xff0c;有什么好用的辦法來快速生成&#xff0c;答案肯定是有的&#xff0c;下面跟隨我來看一下是不是真的很好用。 安裝插件JavaScript (ES6) code snippets 使用時直接按照…

Python批量輸出圖像的尺寸、格式、模式代碼

import os from PIL import Image # 原始文件夾路徑 original_folder rC:\Users\86182\Desktop\OPENCVyt\yt1 # 遍歷原始文件夾中的圖像 for filename in os.listdir(original_folder): img Image.open(os.path.join(original_folder, filename)) Size img.size # …

你了解手機設備的dpr嗎?它和CSS又有什么聯系?

當我們在前端開發中涉及到devicePixelRatio時&#xff0c;我們實際上在談論屏幕像素密度&#xff0c;即每英寸的像素數。這個屬性告訴我們在一個設備上的一個CSS像素對應多少物理像素。 目錄 知識點概覽 dpr值的計算 dpr的用處 知識點概覽 比如我們新買了一個手機&#xff0…

vue vite 環境非構建包編譯 React 報錯定位

1. 背景 眾所周知&#xff0c;vite 在構建生態的位置&#xff0c;vue 與之更是密切&#xff0c;主流的 vue 庫幾乎都與 vite 捆綁。 但有些 UI 庫 如 private/ui 并沒進行行編譯&#xff0c;而是直接將源碼發布到了 npm 中&#xff0c;無法實現兼容化&#xff0c;需要消費方去…

vs-qt中無法加載qsqlite驅動,但是單獨新建demo測試卻又是正常的。。。

開發環境: Vs2015 + qt5.12 背景: 接手了一個項目,可以編譯過去,也可以運行,, 但是登錄一直失敗,,但是數據庫文件也是正常的。。。 最主要的是環境和同事的是一樣的,,,但是他那邊可以加載成功,我這邊不可以。。 后來單獨在vs中創建了一個demo,用來測試QSqlData…

Ubuntu虛擬機上推薦一款免費好用的git版本管理工具

工具叫: gitg 軟件界面如下&#xff1a; FR:徐海濤(hunkxu)

開眼了,自動化測試還能這樣用?

持續集成的自動化測試通常需要將代碼、測試用例與持續集成工具進行綁定&#xff0c;以實現自動運行。然而&#xff0c;Apipost的自動化測試功能需要手動操作&#xff0c;并且需要手動查看測試結果。 為了解決這個問題&#xff0c;Apipost推出了持續集成功能&#xff0c;方便同…

【Shell】正則表達式的操作實例

正則表達式是一個描述一組字符串的模式 是由普通字符和元字符組成的字符集&#xff0c;而這個字符集匹配&#xff08;或指定&#xff09;一個模式。 正則表達式的操作實例 &#xff08;一&#xff09;概述1.定義2.作用3.類型 &#xff08;二&#xff09;字符串匹配實例&#xf…

【論文閱讀】Machine Learning, Linear Algebra, and More: Is SQL All You Need?

文章目錄 摘要一、介紹二、SQL算法原語2.1、Variables2.2、Functions2.3、Conditions2.4、Loops2.5、Errors 三、案例研究3.1、對數據庫友好的SQL映射3.2、性能結果 四、結論以及未來工作 摘要 盡管SQL在簡單的分析查詢中無處不在&#xff0c;但它很少用于更復雜的計算&#xf…

文件流-ASCII文件(中北大學-程序設計基礎(2))

目錄 題目 源碼 結果示例 題目 編寫程序實現以下功能&#xff1a;【要求處理ASCII文件】 &#xff08;1&#xff09;按職工號由小到大的順序將5個員工的數據&#xff08;包括號碼、姓名、年齡和工資&#xff09;輸出到磁盤文件中保存&#xff1b; &#xff08;2&#xff…

自動駕駛決策規劃——坐標轉換

以下內容來自b站up主忠厚老實的老王&#xff0c;視頻鏈接&#xff1a;自動駕駛決策規劃算法序章 總綱與大致目錄_嗶哩嗶哩_bilibilihttps://www.bilibili.com/video/BV1hP4y1p7es/?spm_id_from333.999.0.0&vd_sourced36e625f376908cfa88ef5ecf2fb0ed8侵刪。 決策規劃算法…

自動故障轉移

這里詢問&#xff0c;你的插槽是從哪里移動過來的&#xff1f; all&#xff1a;代表全部&#xff0c;也就是三個節點各轉移一部分具體的id&#xff1a;目標節點的iddone&#xff1a;沒有了 這里我們要從7001獲取&#xff0c;因此填寫7001的id&#xff1a; 填完后&#xff0c;…

02-登錄頁面、動態路由、權限等模塊開發

權限模塊開發流程 前端login頁面開發后端SpringSecurity配置后端login接口開發前端頁面框架搭建前端路由守衛&#xff0c;狀態管理開發前后端完成認證流程 開發Login頁面 創建Login頁面創建router&#xff0c;可以跳轉到Login頁面 Login頁面 使用element-plus開發 認證功…