当前位置: 首页 > news >正文

网站建站分为两种成都十大设计工作室

网站建站分为两种,成都十大设计工作室,莆田网站建站,跨境电商亚马逊目录 虚拟机talk通信 自主编程实现通信(1) 自主编程实现通信(2) 虚拟机talk通信 如果我们想在虚拟机上与其他同学或朋友取得联系,我们可以使用talk程序进行交流。首先我们要打开虚拟机,执行以下命令&…

目录

虚拟机talk通信

自主编程实现通信(1)

自主编程实现通信(2)


虚拟机talk通信

如果我们想在虚拟机上与其他同学或朋友取得联系,我们可以使用talk程序进行交流。首先我们要打开虚拟机,执行以下命令,安装talk程序;

sudo apt update

sudo apt installbsd-talk

然后使用命令启动程序;

sudo systemctl start talk

sudo ufw allow talk

接着我们就可以使用命令进行通信;

talk fangjq

(这里talk 后面接上你想要通信的用户)

这里要注意输入内容以及一些快捷键,否则会出现一些问题;例如^Z是使用了CTRL快捷键,回复的Hello后面的问号是输入问题。

自主编程实现通信(1)

在同一终端下,子进程与父进程的通信;

首先创建一个目录:chat_program用来存放我们的相关文件

mkdir chat_program //创建目录

cd chat_program //进入目录

nano chat.c //创建文件

然后粘贴以下的代码,

#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <sys/select.h>#define BUFFER_SIZE 1024#define EXIT_CMD "exit"int main() {int pipefd[2]; // 父进程到子进程的管道int pipefd2[2]; // 子进程到父进程的管道pid_t pid;// 创建两个管道if (pipe(pipefd) == -1 || pipe(pipefd2) == -1) {perror("pipe");exit(EXIT_FAILURE);}// 创建子进程pid = fork();if (pid == -1) {perror("fork");exit(EXIT_FAILURE);}if (pid == 0) {// 子进程:从父进程接收消息并通过另一个管道发送消息close(pipefd[1]); // 关闭写端close(pipefd2[0]); // 关闭读端char buffer[BUFFER_SIZE];fd_set readfds;int max_fd = (pipefd[0] > pipefd2[1]) ? pipefd[0] : pipefd2[1];while (1) {FD_ZERO(&readfds);FD_SET(STDIN_FILENO, &readfds);FD_SET(pipefd[0], &readfds);if (select(max_fd + 1, &readfds, NULL, NULL, NULL) == -1) {perror("select");exit(EXIT_FAILURE);}if (FD_ISSET(STDIN_FILENO, &readfds)) {// 从标准输入读取消息并发送给父进程ssize_t bytes_read = read(STDIN_FILENO, buffer, BUFFER_SIZE);if (bytes_read <= 0) {break;}buffer[bytes_read - 1] = '\0'; // 去掉换行符if (strcmp(buffer, EXIT_CMD) == 0) {write(pipefd2[1], buffer, strlen(buffer) + 1);break;}write(pipefd2[1], buffer, strlen(buffer) + 1);}if (FD_ISSET(pipefd[0], &readfds)) {// 从父进程接收消息并输出ssize_t bytes_read = read(pipefd[0], buffer, BUFFER_SIZE);if (bytes_read <= 0) {break;}buffer[bytes_read] = '\0';printf("Parent: %s\n", buffer);if (strcmp(buffer, EXIT_CMD) == 0) {break;}}}close(pipefd[0]);close(pipefd2[1]);exit(EXIT_SUCCESS);} else {// 父进程:从子进程接收消息并通过另一个管道发送消息close(pipefd[0]); // 关闭读端close(pipefd2[1]); // 关闭写端char buffer[BUFFER_SIZE];fd_set readfds;int max_fd = (pipefd2[0] > pipefd[1]) ? pipefd2[0] : pipefd[1];while (1) {FD_ZERO(&readfds);FD_SET(STDIN_FILENO, &readfds);FD_SET(pipefd2[0], &readfds);if (select(max_fd + 1, &readfds, NULL, NULL, NULL) == -1) {perror("select");exit(EXIT_FAILURE);}if (FD_ISSET(STDIN_FILENO, &readfds)) {// 从标准输入读取消息并发送给子进程ssize_t bytes_read = read(STDIN_FILENO, buffer, BUFFER_SIZE);if (bytes_read <= 0) {break;}buffer[bytes_read - 1] = '\0'; // 去掉换行符if (strcmp(buffer, EXIT_CMD) == 0) {write(pipefd[1], buffer, strlen(buffer) + 1);break;}write(pipefd[1], buffer, strlen(buffer) + 1);}if (FD_ISSET(pipefd2[0], &readfds)) {// 从子进程接收消息并输出ssize_t bytes_read = read(pipefd2[0], buffer, BUFFER_SIZE);if (bytes_read <= 0) {break;}buffer[bytes_read] = '\0';printf("Child: %s\n", buffer);if (strcmp(buffer, EXIT_CMD) == 0) {break;}}}close(pipefd[1]);close(pipefd2[0]);wait(NULL); // 等待子进程结束}return 0;}

随后通过gcc编译器编译一遍,接着运行,尝试通信;

gcc chat.c -o chat

./chat

完成过后可以通过CTRL+C退出程序。在这段程序中,使用两个进程互相通信,首先根据用户输入的内容,子进程接收过后输出,发出第一段对话,然后用户再输入,接着父进程接收并输出,完成对子进程的回应,这段代码是子进程与父进程轮流对话,灵活性较低,不能多段输出,只能轮回。

除了这种,还有两个终端的对话。

自主编程实现通信(2)

在同一个账号两个终端之间通信;

这里建议先使用IPC或消息管道、消息槽等模式,然后进行实践。

使用以下命令创建管道文件,

mkfifo mypipe

在虚拟机中,管道文件(通常指命名管道或 FIFO 文件)是一种进程间通信(IPC)机制,用于在虚拟机内部或虚拟机与主机之间传递数据。通过创建命名管道文件(如 mkfifo 命令),虚拟机内部的进程可以实现通信。

首先创建两个文件,sender.c和receiver.c,然后输入以下代码;

nano sender.c

nano receive.c

sender.c:

#include <stdio.h>#include <fcntl.h>#include <unistd.h>int main() {int fd = open("mypipe", O_WRONLY);if (fd == -1) {perror("open");return 1;}char buffer[100];printf("Enter message: ");fgets(buffer, sizeof(buffer), stdin);write(fd, buffer, strlen(buffer)+1);close(fd);return 0;}

receiver.c:

#include <stdio.h>#include <fcntl.h>#include <unistd.h>int main() {int fd = open("mypipe", O_RDONLY);if (fd == -1) {perror("open");return 1;}char buffer[100];read(fd, buffer, sizeof(buffer));printf("Received message: %s", buffer);close(fd);return 0;}

同样的操作进行编译,编译过后终端一运行sender.c,终端二运行receive.c,测试运行结果。

可以看到,发送hello,也能接收到hello,这个程序的问题在于只能一条一条发送,而且单项发送。

http://www.dtcms.com/a/436917.html

相关文章:

  • 零基础 网站一家企业如何建设自己的网站 下载
  • 网站开发的费用开源社区源码
  • 购物网站建设实训心得体会欢迎访问语文建设杂志网站
  • 成都手机号码销售网站建设网站后台管理模板下载
  • 微信 网站 收费标准网站建设招标公示
  • 网站制作广重庆专业网站排名团队
  • 普拓网站建设网络平台建设公司排名
  • 山东省建设工程造价管理协会网站网站鼠标代码
  • 网站建设宽度一般都是多少钱wordpress升级后编辑器没有
  • 网站建设相关文章网站开发常用哪几种语言
  • 做网络投票网站好做吗网络推广公司怎么接单
  • 沈阳网站建设21anshan科技感设计感的展厅
  • 企业网站报价模板下载制作网页网站
  • 西安哪个公司可以做网站网站培训中心
  • 专业模板建站软件wordpress笔记主题
  • 通过模板做网站手机网站方案
  • 网站建设最新技术及发展趋势wordpress显示选项取消了吗
  • 深圳哪家网站建设的公司好例点估算网站开发项目工作量
  • 金融营销的网站设计案例中国建设银行网站会员注册
  • 影楼网站模版中国四大门户网站分别是
  • 手机网站 制作教程wordpress旅游社区
  • 淘客做网站有必要吗手机网页免费制作app
  • 建立网站后怎样收费上海网站建设托管
  • 做网站百度收费吗电子商务网站开发策划
  • 衡水电子网站建设自媒体seo是什么意思
  • 民治网站建设毛衣品 东莞网站建设
  • 环保局网站建设wordpress更改文章宽度
  • 【LINUX学习】“su:鉴定故障”和“用户不在sudoers文件中。此事将被报告。”同时出现的解决方法
  • 湖南网络营销企业中山seo网络推广
  • 青岛做网站推广公司建设网站的平台