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

linux系统编程之一

1)fcntl的使用方法
fcntl作用:可以用fcntl函数改变一个已打开的文件属性而不必重新打开文件;

堆排序是完全二叉树,但不是排序二叉树;
排序二叉树要求兄弟节点之间有大小关系,比如说左小右大;
堆排序仅要求父亲节点和孩子节点有大小关系;在vim命令行中,打开另一个文件的操作方法:
输入":e test.txt";复制完程序后(按tab按键查找需要打开的文件),再":e#",回到当前的文件中;//fcntl的使用方法(获取(修改)文件描述符的权限)
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/fcntl.h>
using namespace std;int main(int argc, char *argv[])
{int flags;flags =  fcntl(STDIN_FILENO,F_GETFL); //从标准输入文件描述符中读取文件的flag标志;flags |= O_NONBLOCK;fcntl(0,F_SETFL,flags); //把修改后的flags写回标准输入文件结构体中去char buf[10];ssize_t n;while(1){n = read(0,buf,5);sleep(1);if(n >= 0) break;if(errno != EAGAIN){perror("read");return -1;}write(1,"try again?\n",11);}write(1,buf,n);return 0;
}2)%x和%#x的区别;c语言中%x的意思是16进制输出。2、c语言中符合%#的意思是带格式输出;
3)putchar(10); //换行;4)epoll的学习
需要包含头文件#include <sys/epoll.h>
STDIN_FILENO等的使用,需要包含unistd.h头文件
F_GETFL等的使用,需要包含#include<sys/fcntl.h>头文件
ioctl如果用的话,需要包含头文件#include<sys/ioctl.h>
操作目录是时候,需要添加dirent.h和sys/types.h  注:dirent[戴尔闰他]其实就是 directory entry 的缩写
errno 是记录系统的最后一次错误代码
O_ACCMODE是文件的进入权限,默认是文件可读可写;5)fcntl的使用方法
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/fcntl.h>
using namespace std;int main(int argc, char *argv[])
{int flags;flags = fcntl(atoi(argv[1]),F_GETFL);switch (flags & O_ACCMODE){case O_RDONLY:printf("read only");break;case O_WRONLY:printf("write only");break;case O_RDWR:printf("read write");break;            default:break;}// printf("flags is: %#x\r\n",flags);putchar(10);return 0;
}

2)ioctl用于向设备发控制和配置命令

#include <stdio.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <stdlib.h>using namespace std;int main(int argc, char *argv[])
{struct winsize size;if(isatty(1) == 0){printf("1 is not tty\r\n");exit(1);}if(ioctl(1,TIOCGWINSZ,&size) < 0){perror("ioctl");exit(1);}printf("%drows,%d columns\n",size.ws_row,size.ws_col); //打印当前终端是多少行,多少列return 0;
}
//做多线程的时候,功能和入口要分开;避免高内聚,实现低耦合;
//所谓线程池:就是固定的n个线程,抢一个任务队列中的任务;

3)线程池的应用

//线程池计算5000000里面的素数
#include <stdio.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <stdlib.h>
#include <thread>
#include <iostream>
#include <mutex>
#include <functional>
#include <vector>
#include <unordered_map>
#include <queue>
#include <condition_variable>using namespace std;class Task
{
private:function<void()> func;
public:template<typename FUNC_T,typename ...ARGS>Task(FUNC_T f,ARGS ...args){func = bind(f, forward<ARGS>(args)...);}void run(){func();}
};class ThreadPool
{
private:std::vector<thread*> trr;unordered_map<thread::id,bool> running;queue<Task*> task_q; //任务队列mutex mtx;condition_variable cond;bool starting; //线程开始状态void stop_running() //毒药方法{auto id= this_thread::get_id();running[id] = false;return;}Task* get_Task(){unique_lock<mutex> lock(mtx);while(task_q.empty()) //防止被假唤醒{cond.wait(lock);}Task* t = task_q.front();task_q.pop();return t;}public:ThreadPool(int n = 1) : trr(n),starting(false){this->start();}void worker(){auto id = this_thread::get_id();running[id] = true;while( running[id]){//获取任务            Task* t = get_Task();//执行            t->run(); //动态申请的,所以得用delete删除掉delete t;}}void stop(){for(int i = 0; i<trr.size(); i++){add_task(&ThreadPool::stop_running,this);}for(int i = 0; i<trr.size(); i++){trr[i]->join(); //等待者都被毒死}for(int i = 0; i<trr.size(); i++){delete trr[i];trr[i] = nullptr;}}void start(){for(int i = 0; i < trr.size(); i++){trr[i] = new thread(&ThreadPool::worker,this);}}template<typename FUNC_T,typename... ARGS>void add_task(FUNC_T f,ARGS ...args){//上锁unique_lock<mutex> lock(mtx);task_q.push(new Task(f,forward<ARGS>(args)...));//解锁:同时通知队列中有任务的条件已经达成cond.notify_one(); //锁被解开}virtual ~ThreadPool(){this->stop();while(!task_q.empty()){delete task_q.front();task_q.pop();}}
};bool is_prime(int x)
{for(int i = 2; i*i <= x; i++){if(x%i == 0)return false;}return true;
}int count_prime(int l,int r)
{int cnt = 0;for(int i = l; i <= r; i++){cnt += is_prime(i);}return cnt;
}void work(int l,int r,int& ret) //工作线程
{cout<<std::this_thread::get_id()<<": begin"<<endl;ret = count_prime(l,r);cout<<std::this_thread::get_id()<<": end"<<endl;   
}int main(int argc, char *argv[])
{const int batch = 5000000;int ret[10];ThreadPool tp(5);for(int i = 0, j = 1; i <10; i++, j += batch){tp.add_task(work,j+batch-1,ref(ret[i]));}tp.stop();int ans = 0;for(auto x: ret){ans += x;}cout<<ans<<endl;return 0;
}

4)缓冲区的概要

//缓冲分为全缓冲,行缓冲,无缓冲;
//stdout是行缓冲
//stderr是无缓冲
int main(int argc, char** argv)
{for(int i = 0; i < 1025; i++) //从测试看,缓冲区是1024;fputc('A',stdout); while(1) //不能让程序结束,如果程序结束,则会自动调用写文件操作;{;}return 0;
}

5)open打开方式的mode介绍

S_IRWXU中的S是 stat的意思; 权限位的设置
//如果要用O_CREAT,则要用第3个参数mode,经过测试,如果没有O_CREAT,也能创建文件,但是得到的文件不对;
系统的open的mode用的是S_IRWXU等等,fopen用的如是"r r+"等等; 一个'r',其实带有好多信息;
open中的flags分为必选项和可选项;
errno:错误码,stderr输出的叫错误描述符
printf(“errno = %d\n”,errno); //打印错误代码errno
fprintf(stderr,stderr\n”); //标准出错输出stderr
perror(“perror:); //输出perror:具体错误信息,相当于做翻译用的
printf(“strerror:%s\n”, strerror(errno)); //输出strerror:具体错误信息//注意下面两个是不同的头文件
#include<error.h>
#include<errno.h>
3)open的使用方法
int main(int argc, char** argv)
{if(argc < 2){printf("usage: cmd filename\r\n");return -1;}int fd = open(argv[1],O_WRONLY | O_CREAT,S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH); //一大堆,其实就是0644printf("%s\r\n",argv[1]);if(fd < 0){perror("open rgv[1]");exit(-1);}else{perror("open rgv[1]");}return 0;
}

6)read,write,ftell,rewind,lseek,fseek,fgetc,fputc等函数的使用及测试文件;

4) umask的使用 终端输入umask,则输出0002;
exit(-1)return (-1)的区别在哪里?
exit是退出当前进程,而retrun退出当前函数,所以exit范围更广;5)如何用终端的命令,查看函数的返回值呢?“echo $?”就可以了;
在文件创建中,flag设置O_CREAT|O_EXCL,目的是这个文件必须是自己创建的,已有文件不可以。EXCL的全程是:exclusive美 [ɪkˈskluːsɪv] 独有的
说白了就是:当前进程必须自己创建一个新的文件,而不能使用已有的文件!!!6)ssize_t的第一个s代表的是sign,是有符号的意思;n = read(fd,buf,10); //read的第3个参数是希望读10个数据,但具体多少要看返回值n是多少数据;//read的使用方法
int main(int argc, char** argv)
{char buf[128];if(argc < 2){printf("usage: cmd filename\r\n");return -1;}int fd = open(argv[1],O_RDONLY); ssize_t n = read(fd,buf,10);printf("read bytes is %d\r\n",n);for(ssize_t i = 0; i < n; i++)printf("%c",buf[i]);        putchar(10);n = read(fd,buf,10); //read的第3个参数是希望读10个数据,但具体多少要看返回值n是多少数据;printf("read bytes is %d\r\n",n);for(ssize_t i = 0; i < n; i++)printf("%c",buf[i]);putchar(10);close(fd);return 0;
}7) 从终端设备读,通常以行为单位,读到换行符就返回了,再把读到的数据输出到屏幕上;ssize_t n = read(STDIN_FILENO,buf,10); //shell一直监视终端stdin是否有数据,当一个终端的程序运行起来的时候,shell程序就会退到后台,不运行了,知道终端的程序运行完,才可以使shell继续运行;
int main(int argc, char** argv)
{char buf[128];ssize_t n = read(STDIN_FILENO,buf,10);if(n < 0){perror("read stdin");exit(-1);}n = write(STDOUT_FILENO,buf,n);if(n < 0){perror("write stdin");exit(-1);}return 0;
}8)程序的三种状态,睡眠状态,和运行状态;运行状态又分两种,正在被调度执行状态和就绪状态;#define	EWOULDBLOCK	EAGAIN	/* Operation would block */
EWOULDBLOCK == EAGAIN;EWOULDBLOCK = would block 虚拟语气,应该阻塞
终端就是:/dev/tty = STDIN_FILENO|STDOUT_FILENO;9)非阻塞从终端上读取数据,并打印到屏幕
int main(int argc, char** argv)
{char buf[128];ssize_t n;int fd = open("/dev/tty",O_RDONLY|O_NONBLOCK); //O_RDONLY|O_NONBLOCKif(fd < 0){perror("open /dev/tty");exit(-1);}while(1){ssize_t n = read(fd,buf,10);if(n >= 0 ){      printf("read num %d\r\n",n);            write(STDOUT_FILENO,buf,n);            break;}  if(errno != EAGAIN){perror("other error");exit(-1);}write(STDOUT_FILENO,"try try?\n",9);sleep(1);}close(fd);return 0;
}10)EOF的使用及fgetc的使用
EOF宏就是-1; //对"-1"的补码是255,按位取反是0;如:while(~(c = fgetc(fp)))
int main(int argc, char** argv)
{FILE* fp = fopen("./test.txt","r");char c;while((c = fgetc(fp)) != EOF) //千万别写成这样: while(c = fgetc(fp) != EOF) printf("%c",c);fclose(fp);return 0;
}11)r r+ w w+分别代表:
r:	以只读方式打开文件;
r+:	以读写方式打开文件,原有文件不清除;
w:	以只写方式打开文件,如果文件不存在,则自动创建。如果文件已经存在,把原有的文件内容删除光。再写入新的内容
w+:	以读写模式打开文件,原有文件清空;int main(int argc, char** argv)
{FILE* fp = fopen(argv[1],"w+");if(!fp){perror("open file");exit(-1);        }fputc('J',fp);fputc('L',fp);fputc('5',fp);int n = fgetc(fp); //如果在fopen中,模式是"w",则输出的是"-1";printf("--------   %d\r\n",n);fclose(fp);return 0;
}12)利用fgetc和fputc实现文件的拷贝,案例如下
int main(int argc, char** argv)
{if(argc < 3){printf("uage: cmd + src + dest\r\n");return 1;}FILE* fp1 = fopen(argv[1],"r");if(!fp1){perror("open read file");exit(-1);        }FILE* fp2 = fopen(argv[2],"w");if(!fp2){perror("open write file");exit(-1);        }    char c;while(~(c = fgetc(fp1)))fputc(c,fp2);fclose(fp1);fclose(fp2);    return 0;
}13)fseek的使用,seek是寻找的意思;fseek函数的功能:设置文件指针stream的位置。
whence is:SEEK_CUR,SEEK_END,SEET_SET;
SEET_SET是从文件指针的开始位置计算,按道理说应该写SEET_START更好;
rewind函数:C程序中的库函数,功能是将文件内部的指针重新指向一个流的开头
ftell函数: 在c语言中,ftell函数用来返回当前文件指针的位置;
//fseek,rewind,ftell等函数的使用案例:
int main(int argc, char** argv) 
{FILE* fp = fopen(argv[1],"r+");if(!fp){perror("open  file");exit(-1);        }// rewind(fp);fseek(fp,3,SEEK_SET);printf("pos = %d\n",ftell(fp));fputc('M',fp);fputc('D',fp);printf("pos = %d\n",ftell(fp));    fclose(fp);return 0;
}14)判断一个文件的大小,案例如下:
int main(int argc, char** argv)
{FILE* fp = fopen(argv[1],"r");if(!fp){perror("open  file");exit(-1);        }fseek(fp,0,SEEK_END);printf("file size is: = %d\n",ftell(fp));    fclose(fp);return 0;
}14)lseek的使用方法:lseek的返回值是有意义的,会返回文件的pos位置;从0开始计算;
计算文件的开始位置的偏移量;
int main(int argc, char** argv)
{char buf[10];int n = 0;int fd = open("./test2.txt",O_RDONLY);if(fd < 0){perror("open file");exit(1);}//123MDN789n = read(fd,buf,1);write(STDOUT_FILENO,buf,n); //Ylseek(fd,5,SEEK_CUR);    //如果SEEK_SET,则是N,如果是SEEK_CUR,则是7;n = read(fd,buf,1);    write(STDOUT_FILENO,buf,n); //N    close(fd);return 0;
}

相关文章:

linux系统编程之一

1&#xff09;fcntl的使用方法 fcntl作用:可以用fcntl函数改变一个已打开的文件属性而不必重新打开文件&#xff1b; 堆排序是完全二叉树&#xff0c;但不是排序二叉树&#xff1b; 排序二叉树要求兄弟节点之间有大小关系&#xff0c;比如说左小右大&#xff1b; 堆排序仅要求…...

【LeetCode】《LeetCode 101》第十三章:链表

文章目录 13.1 数据结构介绍13.2 链表的基本操作206. 反转链表&#xff08;简单&#xff09;21. 合并两个有序链表&#xff08;简单&#xff09;24.两两交换链表中的节点&#xff08;中等&#xff09; 13.3 其它链表技巧160. 相交链表&#xff08;简单&#xff09;234. 回文链表…...

Electron webview 内网页 与 preload、 渲染进程、主进程的常规通信 以及企业级开发终极简化通信方式汇总

Electron 嵌入的页面中注入的是 preload.js 通过在标签中给 prelaod赋值&#xff0c;这里提到了 file://前缀&#xff0c;以及静态目录 static 怎么获取 实际代码&#xff0c;其中__static就是我们存放静态文件的地方&#xff0c;这个 static 是 electron 源代码根目录下的文件…...

AI人工训练师,提升外呼机器人的运营效果

外呼机器人是企业客服和营销的重要工具&#xff0c;外呼机器人可以通过语音识别和语音合成技术&#xff0c;自动拨打电话并进行客户服务和营销推广等工作。由于外呼机器人错误识别和理解偏差容易影响外呼效果&#xff0c;许多外呼机器人厂商选择通过AI人工训练师的技术手段来提…...

nginx正向代理、反向代理、负载均衡(重中之重)

nginx中有两种代理方式&#xff1a; 七层代理&#xff08;http协议&#xff09; 四层代理&#xff08;基于tcp或udp的流量转发&#xff09; 一、七层代理 原理&#xff1a;客户端请求代理服务器&#xff0c;由代理服务器转发客户端的http请求&#xff0c;转发到内部的服务器…...

MySQl_2

目录 函数 一.字符串函数 二.数值函数 三.日期函数 四.流程控制函数 约束 多表查询 多表关系 一.内连接 二.外连接 三.自连接 四.联合查询 五.子查询 标量子查询 列子查询 行子查询 表子查询 函数 一.字符串函数 二.数值函数 SELECT LPAD(FLOOR(RAND()*1000000),…...

使用Filter AND Interceptor校验等录(全网独一份,机不可失)

说明&#xff1a;基于spring boot进行的校验 1.熟悉如何使用jwt令牌。&#xff08;不会的看这里&#xff1a;带你领略JWTl令牌的魅力&#xff01;&#xff01;&#xff01;-CSDN博客&#xff09; Filter和Interceptor共用文件&#xff1a;&#xff08;可以仿照&#xff0c;根据…...

ubuntu20.04安装FTP服务

安装 sudo apt-get install vsftpd# 设置开机启动并启动ftp服务 systemctl enable vsftpd systemctl start vsftpd#查看其运行状态 systemctl status vsftpd #重启服务 systemctl restart vsftpdftp用户 sudo useradd -d /home/ftp/ftptest -m ftptest sudo passwd ftptest…...

MyBatisPlus(二十)防全表更新与删除

说明 针对 update 和 delete 语句&#xff0c;阻止恶意的全表更新和全表删除。 实现方式 配置BlockAttackInnerInterceptor拦截器 代码 package com.example.core.config;import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.extension.p…...

14.9 Socket 高效文件传输

网络上的文件传输功能也是很有必要实现一下的&#xff0c;网络传输文件的过程通常分为客户端和服务器端两部分。客户端可以选择上传或下载文件&#xff0c;将文件分块并逐块发送到服务器&#xff0c;或者从服务器分块地接收文件。服务器端接收来自客户端的请求&#xff0c;根据…...

第二节 threejs简单案例

1. 创建3D场景 // 创建3D场景对象Scene const scene new THREE.Scene();// 更改场景背景颜色 scene.background new THREE.Color(#F5F5F5);2. 创建透视投影相机 // 实例化一个透视投影相机对象 const camera new THREE.PerspectiveCamera();相机位置 // 根据需要设置相机…...

PowerShell批量修改DNS域名解析

批量添加DNS A记录 $dnsServerName"" # DNS服务器的服务器名称&#xff0c;如果是在DNS服务器本机执行则可留空 $containerName"test.com" # 域名的后缀也就是DNS Zone Name $mydns[WMIClass]"ROOT\MicrosoftDNS:MicrosoftDNS_resourceRecord"…...

uniapp(uncloud) 使用生态开发接口详情3(新增产品分类,产品列表,新闻列表)

我的想法是有产品分类,产品列表,新闻咨询,新闻列表 项目中, uniCloud > database 目录下新建 sy_product_nav.schema.json // 代码如下 {"bsonType": "object","required": ["classname"],"permission": {"read&…...

XTU-OJ 1339-Interprime

题目描述 n是两个连续的奇素数的平均值&#xff0c;且n不是素数&#xff0c;那么我们称这样的数是"内部素数"。求区间[a,b]内"内部素数"的个数。比如&#xff0c;前5个"内部素数"是4,6,9,12,15。 输入 第一行是样例数T(1≤T≤1000)。 每个样例一…...

FPGA中的LUT查找表工作原理。

在RAM中填入1110,后续的不同AB组合选通对应RAM&#xff0c;Y输出对应RAM存储的值&#xff0c;实现上面逻辑表达式的功能。...

Python爬虫:制作一个属于自己的IP代理模块

前言 在Python爬虫过程中&#xff0c;为了避免被网站的反爬虫机制干扰&#xff0c;我们需要使用IP代理。所谓IP代理&#xff0c;就是通过修改网络请求中的IP地址&#xff0c;来达到隐藏真实IP地址的效果。本文将教你如何制作一个自己的IP代理模块&#xff0c;让你的爬虫更加稳…...

解决QT中文乱码

选中文本带有中文字符的文件&#xff0c;然后按如下点击 弹出对话框&#xff0c;选择当前操作系统的编码格式&#xff0c;选择Save with Encoding 中文字符前用u8进行标识...

GPIO基本原理

名词解释 高低电平&#xff1a;GPIO引脚电平范围&#xff1a;0V~3.3V&#xff08;部分引脚可容忍5V&#xff09;数据0就是0V&#xff0c;代表低电平&#xff1b;数据1就是3.3V&#xff0c;代表高电平&#xff1b; STM32是32位的单片机&#xff0c;所以内部寄存器也都是32位的…...

算法通过村第十五关-超大规模|青铜笔记|海量找数

文章目录 前言用4KB内存寻找重复数总结 前言 提示&#xff1a;并不是所有黑暗的地方&#xff0c;都需要光明。 --珍妮特温特森《句子不是唯一的水果》 在大部分算法中&#xff0c;默认给点给的数据量都是很小的&#xff0c;例如只有几个或者十几个元素&#xff0c;但是如果遇到…...

TCP、IP和HTTP的区别和联系

TCP&#xff08;Transmission Control Protocol&#xff09; TCP是一种面向连接的协议&#xff0c;负责数据的可靠性传输。它提供了错误检测和纠正、数据分段和重新组装、流量控制和拥塞控制等功能&#xff0c;最终确保数据可靠滴从一个端点传输到另一个端点。 TCP建立连接、传…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容&#xff1a;参考网站&#xff1a; PID算法控制 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中&#xff0c;新增了一个本地验证码接口 /code&#xff0c;使用函数式路由&#xff08;RouterFunction&#xff09;和 Hutool 的 Circle…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)

船舶制造装配管理现状&#xff1a;装配工作依赖人工经验&#xff0c;装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书&#xff0c;但在实际执行中&#xff0c;工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...