unix环境高级编程 第一章 UNIX基础知识 Go实现代码

news2025/4/6 11:38:25

ls命令的Go语言实现

package main

import (
	"fmt"
	"os"
)

func main() {
	if len(os.Args) != 2 {
		panic("参数数量不足")
	}
	targetPath := os.Args[1]
	if dirList, err := os.ReadDir(targetPath); err == nil {
		for _, dirInfo := range dirList {
			fmt.Println(dirInfo.Name())
		}
	} else {
		fmt.Println(err.Error())
	}
}

从标准输入复制到标准输出

package main

import (
	"bufio"
	"os"
	"time"
)

func main() {
	reader := bufio.NewReader(os.Stdin)
	message, _ := reader.ReadString('\n')
	os.Stdout.WriteString(message)

	time.Sleep(time.Second)
}

打印进程的pid

package main

import (
	"fmt"
	"os"
)

func main() {
	fmt.Printf("hello world from process ID %d\n", os.Getpid())
}

使用fork创建子进程并查看运行结果

package main

import (
	"fmt"
	"os"
	"os/exec"
	"syscall"
)

func main() {
	bar := 2
	foo := "demo"

	id, _, _ := syscall.Syscall(syscall.SYS_FORK, 0, 0, 0)
	if id == 0 {
		bar++
		cmd := exec.Command("ls")
		out, _ := cmd.CombinedOutput()
		fmt.Printf("ls output: %s\n", string(out))
		fmt.Printf("in child: %d, bar: %v, foo: %v\n", os.Getpid(), bar, foo)
	} else {
		foo += "hello"
		fmt.Printf("in parent: %d, bar: %v, foo: %v\n", os.Getpid(), bar, foo)
	}
}

获取uid与gid

package main

import (
	"fmt"
	"os"
)

func main() {
	fmt.Printf("uid = %d, gid = %d\n", os.Getuid(), os.Getgid())
}

信号signal

中断键 interrupt key, 通常是delete键或者ctrl+c和退出键ctrl+.他们用于中断当前进程.另一种产生信号的方式是调用名为kill的函数.

package main

import (
	"fmt"
	"os"
	"os/exec"
	"os/signal"
	"syscall"
	"time"
)

func main() {
	bar := 2
	foo := "demo"

	c := make(chan os.Signal, 1)
	signal.Notify(c, syscall.SIGINT)

	go func() {
		for sig := range c {
			switch sig {
			case syscall.SIGINT:
				fmt.Printf("interrupt no: %d\n", syscall.SIGINT)
				os.Exit(-1)
			}
		}
	}()

	time.Sleep(5 * time.Second)
	id, _, _ := syscall.Syscall(syscall.SYS_FORK, 0, 0, 0)
	if id == 0 {
		bar++
		cmd := exec.Command("ls")
		out, _ := cmd.CombinedOutput()
		fmt.Printf("ls output: %s\n", string(out))
		fmt.Printf("in child: %d, bar: %v, foo: %v\n", os.Getpid(), bar, foo)
	} else {
		foo += "hello"
		fmt.Printf("in parent: %d, bar: %v, foo: %v\n", os.Getpid(), bar, foo)
	}
}

UNIX时间值

UNIX中有两种时间

  1. 日历时间, 从1970年1月1日00:00:00所经过的秒数累计值.这些时间可用于记录文件最近一次的修改时间等.
  2. 进程时间.也成为CPU时间, 用以度量进程使用的cpu资源.进程时间以tick记录.

当度量一个进程的执行时间时, UNIX系统使用三个进程时间值:

  • 时钟时间
  • 用户CPU时间
  • 系统CPU时间

时钟时间又称为墙上时间(wall clock time). 它是进程运行的时间总量, 其值与系统中同时运行的进程数有关. 在我们报告时钟时间时, 都是在系统中没有其他活动时进行度量的.
用户时间是执行用户指令所用的时间量.
系统cpu时间是为该进程执行内核所经历的时间.
例如,只有一个进程执行一个系统服务, 如read或write, 则在内核内执行该服务所花费的时间就计入该进程的系统cpu时间.
用户cpu时间与系统cpu时间的和常被称为CPU时间.
要得到一个程序运行的时钟时间, 用户时间和系统时间很容易, 使用time(1)命令即可.

$ cd /usr/include
$ time grep _POSIX_SOURCE */*.h > /dev/null
real 0m19.81s
user 0m0.43s 
sys 0m4.53s

time函数的输出格式与所使用的shell有关系.

系统调用和库函数

系统调用和库函数之间有重大区别, 但从用户角度看, 其区别并不非常重要.
本书的系统调用和库函数都是以c函数的形式存在.
但我们应当理解, 如果希望的话, 我们可以替换库函数, 但是通常不能替换系统调用.
以内存分配函数malloc为例, 有很多方法可以进行内存管理.如果不喜欢这样的操作方法, 可以定义自己的malloc函数, 它可能将使用sbrk系统调用.
事实上,有很多软件包, 她们实现自己的存储器分配算法, 但仍然使用sbrk系统调用.
下图显示了应用程序, malloc函数和sbrk系统调用的关系
在这里插入图片描述
从图中可见, 两者职责不同,相互分开, 内核中的系统调用分配另外一块空间给进程, 而库函数malloc则管理这一空间.

另外一个可说明系统调用和库函数区别的例子是, UNIX提供决定当前时间和日期的接口.某些操作系统提供一个系统调用以返回时间, 而另一个则返回日期.
任何特殊的处理, 例如正常时制与夏令时的转换, 由内核处理或要求人为干预.
UNIX则不同, 它只提供一个系统调用, 该系统调用返回国际标准时间1970年1月1日0点以来所经过的秒数.对该值的任何解释, 如将其变换为人们可读的, 使用本地时区的时间和日期, 都留给用户进程进行. 在标准c库中, 提供了若干函数来处理大多数情况. 这些库函数处理各种细节, 例如各种夏令时算法.
应用程序可以调用系统调用或库函数, 而很多库函数则会调用系统调用.
系统调用与库函数的另一个差别是: 系统调用通常提供了一种最小接口, 而库函数通常提供比较复杂的功能. 我们从sbrk系统调用和malloc库函数之间的差别中可以看到这一点.
以后比较不带缓冲的IO函数(第三章)与标准IO函数(第五章)时, 还将看到这种差别.
进程控制系统调用(fork,exec和wait)通常由用户的应用程序直接调用. 但为了简化某些常见情况, UNIX系统也提供了一些库函数, 如system和popen.在这里插入图片描述
为了使读者了解大多数程序员应用的unix系统接口, 我们不得不既说明系统调用, 还要介绍某些库函数.
例如若只说明sbrk系统调用, 那么就会忽略很多应用程序使用的malloc库函数.

小结

本节快速浏览了UNIX, 说明了某些以后会多次用到的基本术语.
下一节是关于UNIX标准化的内容, 以及这方面的工作对当前系统的影响.标准, 特别是ANSI C标准和POSIX.1标准将影响本书的余下部分.

课后问题

日历时间存放在有符号32位整型中, 什么时候会溢出(2038年溢出)
如果进程时间存在32位整型数中, 每秒100tick, 经过多少天溢出(248天)

package main

import "fmt"

func main() {
	var n int32
	n = 2147483646
	for i := 0; i < 5; i++ {
		fmt.Println("n:", n)
		n += 1
	}
}

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

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

相关文章

SpringBoot集成ElasticSearch

文章目录 前言一、ElasticSearch本地环境搭建二、SpringBoot整合ElasticSearch1.pom中引入ES依赖2.application.yaml配置elasticsearch3.ElasticSearchClientConnect连接ES客户端工具类4.ElasticSearchResult封装响应结果5.Person实体类6.Person实体类7.ElasticsearchControlle…

OS之磁盘调度算法

目录 一、先来先服务(FCFS) 基本思想 案例 二、最短寻道时间优先(SSTF) 基本思想 案例 饥饿现象 三、扫描算法(SCAN) 基本思想 案例 四、循环扫描算法(CSCAN) 基本思想 案例 一、先来先服务(FCFS) 基本思想 根据进程请求访问磁盘的先后次序来进行调度 案例 二、…

数据结构与算法04:队列

目录 什么是队列&#xff1f; 循环队列 双端队列 阻塞队列 队列的应用场景 每日一练 什么是队列&#xff1f; 在 上一篇文章 中讲述了栈&#xff1a;先进后出就是栈&#xff0c;队列刚好相反&#xff0c;先进先出的数据结构就是队列&#xff0c;还是拿纸箱子来举例&…

《数据库应用系统实践》------ 校友会信息系统

系列文章 《数据库应用系统实践》------ 校友会信息系统 文章目录 系列文章一、需求分析1、系统背景2、 系统功能结构&#xff08;需包含功能结构框图和模块说明&#xff09;3&#xff0e;系统功能简介 二、概念模型设计1&#xff0e;基本要素&#xff08;符号介绍说明&#x…

DJ6-6/7 文件共享和访问控制、文件保护

目录 6.6 文件共享和访问控制 1、同时存取 2、存取权限 3、文件共享的实现 6.6.1 基于索引结点的共享方式 1、基本思想 2、具体操作 6.6.2 利用符号链接实现文件共享 6.6.3 利用 URL 实现文件共享 6.7 文件保护 6.6 文件共享和访问控制 文件共享的有效控制涉及…

腾讯云服务器可用区是什么?怎么选择随机吗?

腾讯云服务器可用区什么意思&#xff1f;可用区&#xff08;Zone&#xff09;是指腾讯云在同一地域内电力和网络互相独立的物理数据中心&#xff0c;一个可用区故障不会影响另一个可用区的正常运行&#xff0c;所以可用区用于构建高容灾、高可靠性应用。腾讯云服务器网来详细说…

如何在华为OD机试中获得满分?Java实现【截取字符串】一文详解!

✅创作者&#xff1a;陈书予 &#x1f389;个人主页&#xff1a;陈书予的个人主页 &#x1f341;陈书予的个人社区&#xff0c;欢迎你的加入: 陈书予的社区 &#x1f31f;专栏地址: Java华为OD机试真题&#xff08;2022&2023) 文章目录 1. 题目描述2. 输入描述3. 输出描述…

PCA主成分分析 | 机器学习

1、概述(Principal componet analysis,PCA) 是一种无监督学习方法&#xff0c;是为了降低特征的维度。将原始高维数据转化为低维度的数据&#xff0c;高维数据指的是数据的特征维度较多&#xff0c;找到一个坐标系&#xff0c;使得这些数据特征映射到一个二维或三维的坐标系中…

Python爬虫教程:如何爬取教育漏洞报告平台中的漏洞报告?

部分数据来源:ChatGPT 引用 在本教程中,我们将使用 Python 语言和 requests、lxml 库来分析和爬取教育漏洞报告平台的数据。 1. 爬取网站数据 首先,我们需要从教育漏洞报告平台上获取需要的数据。我们可以通过 requests 库向特定网址发送请求,获取响应内容。 import req…

路径规划算法:基于布谷鸟优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于布谷鸟优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于布谷鸟优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化算法…

数字信号的基本运算——线性卷积(相关)和圆周卷积(相关)

简介 在介绍卷积和相关运算之前&#xff0c;需要先认识一些更加基本的运算 翻折 设某一序列x(n)&#xff0c;则x(-n)是以n0的纵轴为对称轴&#xff0c;将x(n)加以翻折得到的 移位 设某一序列x(n)&#xff0c;m为正整数&#xff0c;x(n-m)表示x(n)逐项依次延时&#xff08…

《数据库应用系统实践》------ 超市销售管理系统

系列文章 《数据库应用系统实践》------ 超市销售管理系统 文章目录 系列文章一、需求分析1、系统背景2、 系统功能结构&#xff08;需包含功能结构框图和模块说明&#xff09;3&#xff0e;系统功能简介 二、概念模型设计1&#xff0e;基本要素&#xff08;符号介绍说明&…

数据大航海时代,奇安信如何构筑数据安全的“天盾”?

你知道你的数据正在“被动”泄露吗&#xff1f; 随着ChatGPT技术的快速落地&#xff0c;数据安全面临的挑战越来越多。数据安全供应商Cyberhaven近期发布的一份研究显示&#xff0c;在2023年初的一周内&#xff0c;每十万名员工中机密业务数据被输入ChatGPT199次。用户可能没有…

C Primer Plus第十章编程练习答案

学完C语言之后&#xff0c;我就去阅读《C Primer Plus》这本经典的C语言书籍&#xff0c;对每一章的编程练习题都做了相关的解答&#xff0c;仅仅代表着我个人的解答思路&#xff0c;如有错误&#xff0c;请各位大佬帮忙点出&#xff01; 1.修改程序清单10.7的rain.c程序&…

如何在华为OD机试中获得满分?Java实现【记票统计】一文详解!

✅创作者&#xff1a;陈书予 &#x1f389;个人主页&#xff1a;陈书予的个人主页 &#x1f341;陈书予的个人社区&#xff0c;欢迎你的加入: 陈书予的社区 &#x1f31f;专栏地址: Java华为OD机试真题&#xff08;2022&2023) 文章目录 1. 题目描述2. 输入描述3. 输出描述…

VTK读入DICOM数据

date: 2019-04-02 16:26:00 VTK读入DICOM数据 DICOM示例&#xff1a; 图像来自www.dicomlibrary和medDream 准备图像 公开数据库 DICOM Library&#xff1a;链接&#xff0c;少量CT&#xff08;Computed Tomography&#xff0c;计算机断层扫描&#xff09;&#xff0c;MR&…

网络知识点之-HTTP协议

超文本传输协议&#xff08;Hyper Text Transfer Protocol&#xff0c;HTTP&#xff09;是一个简单的请求-响应协议&#xff0c;它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。请求和响应消息的头以ASCII形式给出&#xff1b;而消息内…

基于Open3D的点云处理4-数据结构Kdtree和Octree

Kdtree Kdtree是一种划分k维数据空间的数据结构&#xff0c;本质也是一颗二叉树&#xff0c;只不过每个节点的数据都是k维&#xff0c;当k1时&#xff0c;就是普通二叉树。 建立Kdtree实际上是一个不断划分的过程&#xff0c;首先选择最sparse的维度&#xff08;一般通过计算…

【LeetCode热题100】打开第6天:正则表达式匹配

文章目录 正则表达式匹配⛅前言&#x1f512;题目&#x1f511;题解 正则表达式匹配 ⛅前言 大家好&#xff0c;我是知识汲取者&#xff0c;欢迎来到我的LeetCode热题100刷题专栏&#xff01; 精选 100 道力扣&#xff08;LeetCode&#xff09;上最热门的题目&#xff0c;适合…

Spring Authorization Server 系列(三)code换取token

code换取token 概述客户端认证方式换取结果 概述 在获取到code后&#xff0c;就可以使用code换取token了&#xff0c;但在换取token这一步还会对客户端进行一些校验&#xff0c;而这也支持不同的方式&#xff0c;一起来看看。 客户端认证方式 JwtClientAssertionAuthenticati…