2024年Go最新进程间通信之2----共享内存,2024年最新2024最新华为Golang校招面试题

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 共享内存本质是一段特殊的内存区域,所有需要访问该共享区域的进程都要把该共享区域映射到本进程的地址空间中去,不同的进程可以通过对内存简单的读写,发生信息交换,从容实现通信。而这块虚拟内存的页面被每个共享进程的页表条目所引用, 同时并不需要在所有进程的虚拟内存都有相同的地址。 进程对象对于共享内存的访问通过 key(键) 来控制, 同时通过 key 进行访问权限的检查。

函数定义如下:

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/shm.h>

key_t ftok(const char *pathname, int proj_id);    不常用。

int shmget(key_t key, int size, int shmflg);

void *shmat(int shmid, const void *shmaddr, int shmflg);

int shmdt(const void *shmaddr);

int shmctl(int shmid, int cmd, struct shmid_ds *buf);

shmget接口:

  • 函数 ftok 用于创建一个关键字, 可以用该关键字关联一个共享内存段。
  • 函数 shmget 用于创建或打开一共享内存段, 该内存段由函数的第一个参数唯一创建。函数成功, 则返回一个唯一的共享内存标识号(相当于进程号, 唯一的标识着共享内存),失败返回-1。
  • 参数 key 是一个与共享内存段相关联关键字, 如果事先已经存在一个与指定关键字关联的共享内存段, 则直接返回该内存段的标识, 表示打开, 如果不存在, 则创建一个新的共享内存段。------可用于连接。
  • key 的值既可以用 ftok 函数产生,也可以是IPC_PRIVATE(用于创建一个只属于创建进程的共享内存, 主要用于父子通信) ,表示总是创建新的共享内存段;
  • 参数 size 指定共享内存段的大小, 以字节为单位;一般为页面的整数倍–一般一个页面为4k—4096个字节
  • 参数 shmflg 是一掩码合成值, 可以是访问权限值与(IPC_CREAT 或 IPC_EXCL)的
  • 合成。 IPC_CREAT 表示如果不存在该内存段, 则创建它。 IPC_EXCL 表示如果该内存
  • 段存在, 则函数返回失败结果(-1)。 如果调用成功, 返回内存段标识, 否则返回-1

shmat接口:

  • 函数 shmat 将共享内存段映射到进程空间的某一地址。
  • 参数 shmid 是共享内存段的标识 通常应该是 shmget 的成功返回值
  • 参数 shmaddr 指定的是共享内存连接到当前进程中的地址位置。通常是 NULL, 表示让系统来选择共享内存出现的地址。
  • 参数 shmflg 是一组位标识, 通常为 0 即可。
  • 如果调用成功, 返回映射后的进程空间的首地址, 否则返回(char *)-1。

函数 shmdt 用于将共享内存段与进程空间分离。

  • 参数 shmaddr 通常为 shmat 的成功返回值
  • 它共享内存分离并没删除它, 只是使得该共享内存对当前进程不在可用。

函数 shmctl 是共享内存的控制函数, 可以用来删除共享内存段。

  • 参数 shmid同上。
  • 参数 cmd 是对共享内存段的操作方式, 可选为 IPC_STAT,IPC_SET,IPC_RMID。 通常为 IPC_RMID, 表示删除共享内存段。
  • 参数 buf 是表示共享内存段的信息结构体数据, 通常为 NULL。

struct shmid_ds {

struct ipc_perm shm_perm;    /* Ownership and permissions */

size_t          shm_segsz;   /* Size of segment (bytes) */

time_t          shm_atime;   /* Last attach time */

time_t          shm_dtime;   /* Last detach time */

time_t          shm_ctime;   /* Last change time */

pid_t           shm_cpid;    /* PID of creator */

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

,真正体系化!**

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

华为OD-货币单位换算通常是在处理涉及货币计算的业务场景时,需要将一种货币值转换成另一种货币。在Go语言中,你可以使用标准库`math/big`来进行大数计算,并结合第三方库如`github.com/rivo/xstrings`进行字符串操作,如果涉及到实时汇率,可能还需要API调用获取实时数据。 以下是一个简单的示例,展示如何创建一个函数来换算两个货币之间的价值: ```go package main import ( "fmt" "golang.org/x/text/currency" "golang.org/x/text/language" "golang.org/x/text/number/amount" ) func CurrencyConverter(amount float64, fromCurrency string, toCurrency string) (float64, error) { // 使用golang.org/x/text包处理货币格式和汇率 currencies := currency.Tagged(map[string]currency.Name{ "USD": "USD", // 示例:美元 "CNY": "CNH", // 示例:离岸人民币 }) // 其他货币可以添加到这个map中 from, err := currencies Tag(fromCurrency) if err != nil { return 0, err } to, _ := currencies Tag(toCurrency) // 假设汇率API返回了当前的汇率,这里仅做示例 rate := 6.5 // 从USD到CNY的假设汇率 result := amount.New(float64(amount), from).Quantize(0, amount.TruncatingMode(RoundHalfEven)) // 货币金额四舍五入 converted := result.Mul(rate).To(to) return converted.Value(), nil } func main() { // 示例:将100美元转换为中国人民币 convertedAmount, err := CurrencyConverter(100, "USD", "CNY") if err != nil { fmt.Println("Error:", err) } else { fmt.Printf("100 USD is equivalent to %.2f CNY\n", convertedAmount) } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值