任何进程启动时都可以赋予一个字符串数组作为参数,一般名为ARGV或ARGS。通过解析这些参数可以让你的程序更加通用,例如cp命令通过给定两个参数就可以复制任意的文件,当然如果需要的参数太多最好还是使用配置文件。获得进程Argument进程参数一般可分为两类,一是Argument,也就是作为进程运行的实体参数。例如cp config.yml config.yml.bak的这两个参数。
每个进程都一定有进程名字,例如我们运行top,进程名就是“top”,如果是自定义的程序呢?其实进程名一般都是进程参数的第一个字符串,在Go中可以这样获得进程名。package mainimport ( "fmt" "os")func main() { processName := os.Args[0] fmt.Println(processName)}进程的输出结果如下。root@87096bf68cb2:/go/src# go run process_name.
每个进程除了一定有PID还会有PPID,也就是父进程ID,通过PPID可以找到父进程的信息。为什么进程都会有父进程ID呢?因为进程都是由父进程衍生出来的,后面会详细介绍几种衍生的方法。那么跟人类起源问题一样,父进程的父进程的父进程又是什么呢?
首先我们来学习PID这个概念,PID全称Process ID,是标识和区分进程的ID,它是一个全局唯一的正整数。原来Hello World进程运行时也有一个PID,只是它运行结束后PID也释放了,我们可以通过print_pid.go程序显示当前进程的PID。示例程序程序print_pid.go的源码如下,通过Getpid()函数可以获得当前进程的PID。
根据维基百科的定义,进程(Process)是计算机中已运行程序的实体。用户下达运行程序的命令后,就会产生进程。进程需要一些资源才能完成工作,如CPU使用时间、存储器、文件以及I/O设备,且为依序逐一进行,也就是每个CPU核心任何时间内仅能运行一项进程。我们简单总结下,进程就是代码运行的实体。
Thanks Wawa LeungOtherwise the book would be released two years ago
本书为开源电子书
这是一篇源自官方博客 的文章。在我看来, React 是较早使用 JavaScript 构建大型、快速的 Web 应用程序的技术方案。它已经被我们广泛应用于 Facebook 和 Instagram 。React 众多优秀特征中的其中一部分就是,教会你去重新思考如何构建应用程序。本文中,我将跟你一起使用 React 构建一个具备搜索功能的产品列表。
介绍上一章我们介绍了 JavaScript 的基本内容和 DOM 对象的各个方面,包括如何访问 node 节点。本章我们将讲解如何通过 DOM 操作元素并且讨论浏览器事件模型。操作元素上一章节我们提到了 DOM 节点集合或单个节点的访问步骤,每个 DOM 节点都包括一个属性集合,大多数的属性都提供为相应的功能提供了抽象。
Java 虚拟机屏蔽了与具体操作系统平台相关的信息,使得 Java 语言编译程序只需生成在 Java 虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java 虚拟机在执行字节码时,实际上最终还是把字节码解释成具体平台上的机器指令执行。
多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。具有这种能力的系统包括对称多处理机、多核心处理器以及芯片级多处理(Chip-level multithreading)或同时多线程(Simultaneous multithreading)处理器。
本文从市面主流的浏览器及相应的内核引擎开始,介绍了Chromium为代表的浏览器架构及Blink内核的功能架构。Chromium为多进程架构,用户从启动运行浏览器后,先后经过页面导航、渲染、资源加载、样式计算、布局、绘制、合成到栅格化,最后完成GPU展示。而页面渲染完成后,浏览器如何响应页面操作事件也进行了深入的介绍。良心推荐!
部门的开发同学最近在开发一个活动的过程中,需要关注大量的应用后台逻辑,捕捉各种事件的触发。在设计时打算采用Kafka消息队列进行业务逻辑的解耦,这样活动开发和后台开发同学的工作就分离开了。但是使用的同学不是很熟悉其原理,担心以下几个问题:
LinuxGoDockerRunGoByExample
理解Unix进程Unix编程艺术Unix环境高级编程Go Web编程Go并发编程实战
Sendfile是Linux实现的系统调用,可以通过避免文件在内核态和用户态的拷贝来优化文件传输的效率。其中大名鼎鼎的分布式消息队列服务Kafka就使用sendfile来优化效率,具体用法可参见其官方文档。优化策略在普通进程中,要从磁盘拷贝数据到网络,其实是需要通过系统调用,进程也会反复在用户态和内核态切换,频繁的数据传输在此有效率问题。
SIGKILL是常见的Linux信号,我们使用kill命令杀掉进程也就是像进程发送SIGKILL信号。和其他信号不同,SIGKILL和SIGSTOP是不可被Catch的,因此下面的代码是能编译通过但也是无效的,更多细节可以参考golang/go#9463.c := make(chan os.Signal, 1)signal.Notify(c, syscall.SIGKILL, syscall.
如果你想创建一个目录并授予777权限,你需要怎么做?查看Go的API文档我们可以这样写。源文件为mkdir.go。package mainimport ( "fmt" "os")func main() { err := os.MkdirAll("/tmp/gotest/", 0777) if err != nil { panic(err) } fmt.
对进程有了深入理解后,我们编写实际应用可能遇到这些坑,这里总结一下。
实现Flock前面提到进程的文件锁,实际上Run也用到了,可以试想下以下的场景。用户A执行run pt-summary,由于本地已经缓存了所以会直接运行本地的脚本。同时用户B执行run -u pt-summary,加上-u或者--update参数后Run会从远端下载并运行最新的脚本。如果不加文件锁的话,用户A的行为就不可预测了,而文件锁很好得解决了这个问题。具体使用方法如下,我们封装了以下的接口。
关注时代Java