【嵌入式】——Linux系统远程操作和程序编译

目录

一、虚拟机配置网络设置

 二、使用PuTTY登录新建的账户

1、在ubuntu下开启ssh服务

2、使用PuTTY连接

三、树莓派实现远程登录

四、树莓派使用VNC viewer登录

五、Linux使用talk聊天程序

 1、使用linux自带的talk命令

2、使用c语言编写一个talk程序


一、虚拟机配置网络设置

(1)将网络适配器改为桥接模式 (“虚拟机” ——> “设置”)

(2)点击编辑-> 虚拟网络编辑器

进去过后点击更改配置,进入下图界面

 (3)创建一个新用户

sudo adduser classmate1
sudo usermod -aG sudo classmate1

自己设置密码

(4)登录新设置的用户,查看ip地址

su classmate1
ifconfig

 二、使用PuTTY登录新建的账户

1、在ubuntu下开启ssh服务

sudo apt-get install ssh
service ssh start
service ssh status

开启后可以让其它同学ping一下ip地址

2、使用PuTTY连接

配置PuTTY

 在配置选项 connection -> SSH -> Auth -> X11 forwarding 处,将 Enable X11 forwarding 打钩

然后 session->host name 处填写服务器IP 地址(即Ubuntu的IP地址),再点击 open 连接远程服务器

之后输入用户名和密码进行登录

 连接成功后,输入命令 set DISPLAY=xxx.xxx.xxx.xxx:0 ,(xxx.xxx.xxx.xxx是你所使用电脑windows下配置的IP地址)

三、树莓派实现远程登录

运行putty,在配置选项 connection -> SSH -> Auth -> X11 forwarding 处,将 Enable X11 forwarding 打钩;然后 session->host name 处填写服务器IP地址,再点击 open 连接 远程服务器。

 用 putty 连接,打开 chromium 浏览器(输入命令 chromium-browser)

四、树莓派使用VNC viewer登录

 输入IP地址后使用账号密码登录

五、Linux使用talk聊天程序

 1、使用linux自带的talk命令

talk命令是一个用于Linux用户之间交流的实时聊天程序。这个命令允许你和同一主机或不同主机上的其他用户进行实时的对话。talk命令打开了一个发送窗口和一个接收窗口,使得你可以在键入自己的消息的同时看到对方的消息。它是一个视觉通讯程序,将你的终端上的行复制到另一个用户的终端,就像一个即时通讯服务一样。

talk person

然后等待对方回应即可 

2、使用c语言编写一个talk程序

要实现一个支持 多客户端聊天 的 Linux C 程序,我们可以使用 Socket 编程(基于 TCP/IP)让多个客户端连接到一个中央服务器,并实现实时消息转发

功能说明

  1. 服务器

    • 监听端口 8080,接受多个客户端连接。

    • 使用 select() 实现多路复用,避免阻塞。

    • 将任一客户端的消息广播给所有其他客户端。

  2. 客户端

    • 连接服务器后,启动一个线程专门接收消息。

    • 主线程负责发送用户输入的消息。

chat.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/wait.h>#define BUFFER_SIZE 1024int main() {int parent_to_child[2];  // 父进程→子进程的管道int child_to_parent[2];  // 子进程→父进程的管道char buffer[BUFFER_SIZE];// 创建管道if (pipe(parent_to_child) == -1 || pipe(child_to_parent) == -1) {perror("pipe failed");exit(EXIT_FAILURE);}pid_t pid = fork();if (pid == -1) {perror("fork failed");exit(EXIT_FAILURE);}if (pid == 0) {  // 子进程close(parent_to_child[1]);  // 关闭父→子的写入端close(child_to_parent[0]);  // 关闭子→父的读取端while (1) {// 读取父进程消息ssize_t bytes_read = read(parent_to_child[0], buffer, BUFFER_SIZE);if (bytes_read <= 0) break;buffer[bytes_read] = '\0';printf("Child received: %s", buffer);// 发送回复给父进程printf("Child reply: ");fgets(buffer, BUFFER_SIZE, stdin);write(child_to_parent[1], buffer, strlen(buffer) + 1);}close(parent_to_child[0]);close(child_to_parent[1]);} else {  // 父进程close(parent_to_child[0]);  // 关闭父→子的读取端close(child_to_parent[1]);  // 关闭子→父的写入端while (1) {// 发送消息给子进程printf("Parent message: ");fgets(buffer, BUFFER_SIZE, stdin);write(parent_to_child[1], buffer, strlen(buffer) + 1);// 读取子进程回复ssize_t bytes_read = read(child_to_parent[0], buffer, BUFFER_SIZE);if (bytes_read <= 0) break;buffer[bytes_read] = '\0';printf("Parent received: %s", buffer);}close(parent_to_child[1]);close(child_to_parent[0]);wait(NULL);  // 等待子进程结束}return 0;
}

 server.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/select.h>#define MAX_CLIENTS 10
#define BUFFER_SIZE 1024int clients[MAX_CLIENTS] = {0};int main() {int server_fd, new_socket, max_sd, activity;struct sockaddr_in address;fd_set readfds;char buffer[BUFFER_SIZE];// 创建服务器 socketif ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {perror("socket failed");exit(EXIT_FAILURE);}address.sin_family = AF_INET;address.sin_addr.s_addr = INADDR_ANY;address.sin_port = htons(8080);// 绑定 socket 到端口if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {perror("bind failed");exit(EXIT_FAILURE);}// 监听连接if (listen(server_fd, 3) < 0) {perror("listen failed");exit(EXIT_FAILURE);}printf("Server started on port 8080. Waiting for connections...\n");while (1) {FD_ZERO(&readfds);FD_SET(server_fd, &readfds);max_sd = server_fd;// 添加所有客户端 socket 到 fd_setfor (int i = 0; i < MAX_CLIENTS; i++) {if (clients[i] > 0) {FD_SET(clients[i], &readfds);if (clients[i] > max_sd) max_sd = clients[i];}}// 等待 socket 活动activity = select(max_sd + 1, &readfds, NULL, NULL, NULL);if (activity < 0) {perror("select error");continue;}// 处理新连接if (FD_ISSET(server_fd, &readfds)) {int addrlen = sizeof(address);if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {perror("accept failed");continue;}// 添加新客户端for (int i = 0; i < MAX_CLIENTS; i++) {if (clients[i] == 0) {clients[i] = new_socket;printf("New client connected (socket %d)\n", new_socket);break;}}}// 处理客户端消息for (int i = 0; i < MAX_CLIENTS; i++) {if (clients[i] > 0 && FD_ISSET(clients[i], &readfds)) {int bytes_read = read(clients[i], buffer, BUFFER_SIZE);if (bytes_read == 0) {  // 客户端断开printf("Client %d disconnected\n", clients[i]);close(clients[i]);clients[i] = 0;} else {  // 广播消息buffer[bytes_read] = '\0';printf("Broadcasting: %s", buffer);for (int j = 0; j < MAX_CLIENTS; j++) {if (clients[j] > 0 && j != i) {send(clients[j], buffer, strlen(buffer), 0);}}}}}}return 0;
}

client.cclient.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <pthread.h>#define BUFFER_SIZE 1024void *receive_handler(void *arg) {int sock = *(int *)arg;char buffer[BUFFER_SIZE];while (1) {int bytes_read = read(sock, buffer, BUFFER_SIZE);if (bytes_read <= 0) {printf("Server disconnected\n");exit(EXIT_FAILURE);}buffer[bytes_read] = '\0';printf("Received: %s", buffer);}
}int main() {int sock;struct sockaddr_in server_addr;pthread_t recv_thread;char buffer[BUFFER_SIZE];// 创建客户端 socketif ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {perror("socket failed");exit(EXIT_FAILURE);}server_addr.sin_family = AF_INET;server_addr.sin_port = htons(8080);// 将 IP 地址从字符串转换为二进制形式if (inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr) <= 0) {perror("invalid address");exit(EXIT_FAILURE);}// 连接服务器if (connect(sock, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {perror("connect failed");exit(EXIT_FAILURE);}printf("Connected to server. Start chatting!\n");// 创建线程接收消息pthread_create(&recv_thread, NULL, receive_handler, (void *)&sock);// 主线程发送消息while (1) {fgets(buffer, BUFFER_SIZE, stdin);send(sock, buffer, strlen(buffer), 0);}close(sock);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/79631.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

春和景明-C语言简单代码

题目要求&#xff1a; 请在centOS Linux中编写一个C语言程序实现如下功能&#xff1a; 同时创建100个用户&#xff0c;用户的账户名称为&#xff1a;Student01 Student02 … Student100;设置每个用户的初始密码为&#xff1a;stud123456请用gcc编译C的源代码&#xff0c;生…

设计模式之工厂模式(factory pattern):在商品对象创建系统中的应用

目录 一、设计思路 1. 简单工厂模式 2. 工厂方法模式 3. 抽象工厂模式 二、UML类图&#xff08;PlantUML格式&#xff09; 1.简单工厂模式 2.工厂方法模式 3.抽象工厂模式 三、实现过程与结果 1. 简单工厂模式 2. 工厂方法模式 3. 抽象工厂模式 四、总结 在面向对…

Trae,字节跳动推出的 AI 编程助手插件

Trae 插件是 Trae 旗下全新一代的人工智能编程助手&#xff08;前身为 MarsCode 编程助手&#xff09;&#xff0c;以插件形式集成在本地开发环境中&#xff0c;具备极高的兼容性和灵活性&#xff0c;旨在提升开发效率和代码质量。它支持超过100种编程语言&#xff0c;兼容主流…

工作纪实_63-Mac电脑使用brew安装软件

最近在接触kafka&#xff0c;想着在自己的电脑安装一套环境&#xff0c;docker也能行&#xff0c;但是还是想装一些原生的软件试试看&#xff0c;因此便想着整理一下brew的命令&#xff0c;这命令确实是方便&#xff0c;不需要下载tar包乱八七糟的东西&#xff0c;一键安装 bre…

Python语法系列博客 · 第8期[特殊字符] Lambda函数与高阶函数:函数式编程初体验

上一期小练习解答&#xff08;第7期回顾&#xff09; ✅ 练习1&#xff1a;找出1~100中能被3或5整除的数 result [x for x in range(1, 101) if x % 3 0 or x % 5 0]✅ 练习2&#xff1a;生成字符串长度字典 words ["apple", "banana", "grape…

Redis--主从复制

目录 一、配置 1.1 建立复制 1.2 断开复制 1.3 安全性 1.4 只读 1.5 传输延迟 二、拓扑 2.1 一主一从结构 2.2 一主多从结构 2.3 树形主从结构 在分布式系统中为了解决单点问题&#xff0c;通常会把数据复制多个副本部署到其他服务器&#xff0c;满足故障恢 复和负载均衡等需求…

已注册商标如何防止被不使用撤销!

近年来已注册商标被撤销越来越多&#xff0c;不乏著名企业或机构&#xff0c;普推知产商标老杨看到前一阵看到央视和百度等申请的商标也被申请撤销&#xff0c;连续三年不使用撤销也是正常的商标流程。 已注册商标被撤销普推老杨看到案例主要是集中在一些早期申请注册的好记的商…

解密大模型背后的秘密:训练、优化与挑战

解密大模型背后的秘密&#xff1a;训练、优化与挑战 在当今的人工智能领域&#xff0c;大模型&#xff08;Large Language Models, LLMs&#xff09;已经成为了一个不可忽视的存在。从自然语言处理到图像生成&#xff0c;再到推荐系统&#xff0c;大模型以其强大的泛化能力和创…

App自动化测试流程方案与架构设计

App自动化测试流程方案与架构设计 一、核心流程设计 #mermaid-svg-kN4GmIvHb8MMT83M {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-kN4GmIvHb8MMT83M .error-icon{fill:#552222;}#mermaid-svg-kN4GmIvHb8MMT83M .e…

字节跳动发布视频生成基础大模型 Seaweed-7B

近日&#xff0c;字节跳动发布了其全新视频生成基础大模型 Seaweed-7B&#xff0c;该模型由字节 Seed 团队开发&#xff0c;参数量仅为 70 亿&#xff0c;在多个方面展现出卓越性能&#xff0c;为 AI 视频生成领域带来了新的突破。 功能特点 支持多种生成方式&#xff1a;Sea…

如何基于区块链进行虚拟电厂运营平台建设?

本项目旨在基于区块链技术建设虚拟电厂运营平台&#xff0c;以提升省内大用户及工业企业和工业园区的需求响应能力&#xff0c;优化能源结构配置&#xff0c;并推动能源交易、需求响应和现货交易等新型业态的发展。通过建设虚拟电厂&#xff0c;项目将实现工业企业及园区各供用…

LeetCode[459]重复的子字符串(KMP解法)

思路&#xff1a; 最近迷上了KMP算法&#xff0c;所以这道题也是来搞一下KMP算法&#xff0c;总所周知KMP是需要维护一个前缀表&#xff0c;KMP算法不是比较一个字符串包不包含另一个字符串的吗&#xff0c;这个重复字符串的题也能用&#xff1f;猫爷&#xff1a;毋庸置疑&…

spring-batch批处理框架(2)

文章目录 八、作业控制8.1 作业启动8.1.1 SpringBoot 启动8.1.2 Spring 单元测试启动8.1.3 RESTful API 启动 8.2 作业停止方案1&#xff1a;Step 步骤监听器方式方案2&#xff1a;StepExecution停止标记 8.3 作业重启8.3.1 禁止重启8.3.2 限制重启次数8.3.3 无限重启 九、Item…

uniapp的通用页面及组件基本封装

1.基本布局页面 适用于自定义Navbar头部 <template><view :style"{ background : param.bgColor , height: 100% }"><block v-if"param.noHead"><slot name"head"></slot></block><block v-if"!p…

基于MTF的1D-2D-CNN-GRU-Attention时序图像多模态融合的故障识别,适合研究学习(Matlab完整源码和数据),附模型研究报告

基于MTF的1D-2D-CNN-GRU-Attention时序图像多模态融合的故障识别&#xff0c;适合研究学习&#xff08;Matlab完整源码和数据&#xff09;&#xff0c;附模型研究报告 目录 基于MTF的1D-2D-CNN-GRU-Attention时序图像多模态融合的故障识别&#xff0c;适合研究学习&#xff08;…

HTTP/1.1 队头堵塞问题

文章目录 一、队头堵塞1、非管线化2、管线化 二、如何解决&#xff1f; 一、队头堵塞 1、非管线化 如图&#xff0c;http 请求必须等到上一个请求响应后才能发送&#xff0c;后面的以此类推&#xff0c;由此可以看出&#xff0c;在一个 tcp 通道中&#xff0c;如果某个 http 请…

施磊老师基于muduo网络库的集群聊天服务器(二)

文章目录 Cmake简单介绍Cmake与MakefileCmake配置CmakeLists.txt 编写完整cmake例子文件夹杂乱问题多级目录Cmakevscode 极其推荐 的 cmake方式 Mysql环境与编程mysql简单使用User表Friend表AllGroup表GroupUser表OfflineMessage表 集群聊天项目工程目录创建网络模块代码Chatse…

4.18---缓存相关问题(操作原子性,击穿,穿透,雪崩,redis优势)

为什么要用redis做一层缓存&#xff0c;相比直接查mysql有什么优势&#xff1f; 首先介绍Mysql自带缓存机制的问题&#xff1a; MySQL 的缓存机制存在一些限制和问题,它自身带的缓存功能Query Cache只能缓存完全相同的查询语句&#xff0c;对于稍有不同的查询语句&#xff0c…

健康养生指南

在快节奏的现代生活中&#xff0c;健康养生成为人们关注的焦点。它不仅关乎身体的强健&#xff0c;更是提升生活质量、预防疾病的关键。掌握科学的养生方法&#xff0c;能让我们在岁月流转中始终保持活力。 饮食是健康养生的基础。遵循 “均衡膳食” 原则&#xff0c;每日饮食需…

#去除知乎中“盐选”付费故事

添加油猴脚本&#xff0c;去除知乎中“盐选”付费故事 // UserScript // name 盐选内容隐藏脚本 // namespace http://tampermonkey.net/ // version 0.2 // description 自动隐藏含有“盐选专栏”或“盐选”文字的回答卡片 // author YourName // mat…