fork

进程和程序:编写shell——《Unix/Linux编程实践教程》读书笔记(第8章)

落爺英雄遲暮 提交于 2020-02-29 15:11:33
1、Unix shell的功能 shell是一个管理进程和运行程序的程序。所有常用的shell都有3个主要功能: (1)运行程序; (2)管理输入和输出 (3)可编程 shell同时也是带有变量和流程控制的编程语言。 2、Unix的进程模型 一个程序是存储在文件中的机器指令序列,一般它是由编译器将源代码编译成二进制格式的代码。运行一个程序意味着将这些机器指令序列载入内存然后让处理器(CPU)逐条执行。在Unix术语中,一个可执行程序是一些机器指令机器数据的序列。一个进程是程序运行时的内存空间和设置。数据和程序存储在磁盘文件中,程序在进程中运行。 每个进程都有一个可以唯一标识它的数字,被称为进程ID,一般简称PID;同时也有一个父进程ID(PPID)。每个进程都与一个终端相连,都一个已运行的时间,有优先级,有niceness级别,有大小。。。 Unix系统中的内存分为系统空间和用户空间。进程存在于用户空间。 3、如何执行一个程序 shell打印提示符,用户输入指令,shell就运行这个命令,然后shell再次打印提示符——如此反复。 一个shell的主循环执行下面的4步: (1)用户键入a.out (2)shell建立一个新的进程来运行这个出现 (3)shell将程序从磁盘载入 (4)程序在它的进程中运行知道结束 即: while (!end_of_input) get

Head First C 第九章 进程与系统调用 用fork()+exec()运行子进程

心已入冬 提交于 2020-02-29 14:01:39
Head First C 第九章 进程与系统调用 用fork()+exec()运行子进程 问题引入 :当你想循环使用exec调用另外一个程序时,发现只调用了一次就结束了。这是因为, exec函数通过运行新程序来替换当前程序 ,因此,后面的代码都没有运行。 为了达到我们想要的效果,在此引入 fork() 系统调用。 实例:RSS订阅功能 int main(int argc, char *argv[]) { char *feeds[] = {"http://www.cnn.com/rss/celebs.xml", "http://www.rollingstone.com/rock.xml", "http://eonline.com/gossip.xml"}; int times = 3; int i; char *phrase = argv[1]; for (i = 0; i < times; i++) { char var[255] = {}; sprintf(var, "RSS_FEED=%s", feeds[i]); char *vars[] = {var, NULL}; if (execle("/usr/bin/python", "/usr/bin/python", "rssgossip.py", phrase, NULL, vars) == -1) { fprintf

兄弟连学Python__GitHub入门

|▌冷眼眸甩不掉的悲伤 提交于 2020-02-29 11:13:56
一、前言 编程进阶的道路是坎坷的,没有任何捷径。这个时期只能是积累、吸收、学习、坚持,做到 量的积累,到质的飞跃 古语有云:‘书山有路,勤为径’、‘不积跬步,无以至千里’ 编程是一个动手实践性的学科,多动手才是王道,积累代码量。那么问题就来了: 写什么呢? 二、什么是 GitHub 如果把编程比做绘画,那么 GitHub 就是一个‘巨型画展’,里面展出了各式各样、各种风格的‘画作’,有名家的作品,有默默无闻的作者的作品。整个画展中的任何作品,你可以随意浏览,任意临摹,与作者讨论作品中的想法、思路。 同比到编程中,就是各种‘编程作品’。通过‘临摹’和学习别人的代码,你就会知道要写些什么了。不要想着上来就写一个特别 NB 的项目,优秀的项目不是一朝一夕完成的,都是一步步地借鉴、优化、完善—— 罗马不是一天建成的 。 在 GitHub 上,你可以与其他百万程序员一起创造有趣、有价值的程序。准备好,加入 GitHub 了吗? 三、开始 GitHub 探索之旅 这章主要讲述快速使用 GitHub,不会介绍任何 Git 命令。 3.1 注册 只需要三步,10秒: 注册地址 依次输入用户名、邮箱、密码 选择账号性质:Unlimited public repositories for free(免费)、付费,免费账号就可以了 调查问卷,skip this step(跳过这步) 注册成功 最后

从0开始学习 GITHUB 系列之「GITHUB 常见的几种操作」

白昼怎懂夜的黑 提交于 2020-02-29 03:12:32
我们都说开源社区最大的魅力是人人多可以参与进去,发挥众人的力量,让一个项目更完善,更强壮。那么肯定有人疑问,我自己目前还没有能力开源一个项目,但是想一起参与到别的开源项目中,该怎么操作呢?那么今天,就来给大家一起介绍下 GitHub 上的一些常见的操作,看完之后你就知道方法了。 我们姑且以 Square 公司开源的 Retrofit 为例来介绍。 打开链接: https://github.com/square/retrofit 然后看到如下的项目主页: 可以看到一个项目可以进行的操作主要就是两部分,第一部分包括 Watch、Star、Fork ,这三个操作之前的系列介绍过了,这里就不啰嗦了。 我们着重来介绍第二部分,分别包括 Code、Issues、Pull requests、Projects、Wiki、Pulse、Graphs。接下来我们来一个个解释下。 Code 这个好理解,就是你项目的代码文件而已,这里说明一下,每个项目通常都会有对该项目的介绍,只需要在项目的根目录里添加一个 README.md 文件就可以,使用 markdown 语法,GitHub 自动会对该文件进行渲染。 Issues Issues 代表该项目的一些问题或者 bug,并不是说 Issues 越少越好,Issues 被解决的越多说明项目作者或者组织响应很积极,也说明该开源项目的作者很重视该项目。我们来看下

一道面试题:说说进程和线程的区别

╄→尐↘猪︶ㄣ 提交于 2020-02-28 17:00:09
一道面试题:说说进程和线程的区别 在理解进程和线程概念之前首选要对并发有一定的感性认识,如果服务器同一时间内只能服务于一个客户端,其他客户端都再那里傻等的话,可见其性能的低下估计会被客户骂出翔来,因此并发编程应运而生,并发是网络编程中必须考虑的问题。实现并发的方式有多种:比如多进程、多线程、IO多路复用。 多进程 进程是资源(CPU、内存等)分配的基本单位,它是程序执行时的一个实例。程序运行时系统就会创建一个进程,并为它分配资源,然后把该进程放入进程就绪队列,进程调度器选中它的时候就会为它分配CPU时间,程序开始真正运行。 Linux系统函数 fork() 可以在父进程中创建一个子进程,这样的话,在一个进程接到来自客户端新的请求时就可以复制出一个子进程让其来处理,父进程只需负责监控请求的到来,然后创建子进程让其去处理,这样就能做到并发处理。 # -*- coding:utf-8 -*- import os print('当前进程:%s 启动中 ....' % os.getpid()) pid = os.fork() if pid == 0: print('子进程:%s,父进程是:%s' % (os.getpid(), os.getppid())) else: print('进程:%s 创建了子进程:%s' % (os.getpid(),pid )) 输出结果: 当前进程:27223

进程与线程的区别

|▌冷眼眸甩不掉的悲伤 提交于 2020-02-28 16:59:49
在理解进程和线程概念之前首选要对并发有一定的感性认识,如果服务器同一时间内只能服务于一个客户端,其他客户端都再那里傻等的话,可见其性能的低下估计会被客户骂出翔来,因此并发编程应运而生,并发是网络编程中必须考虑的问题。实现并发的方式有多种:比如多进程、多线程、IO多路复用。 多进程 进程是资源(CPU、内存等)分配的基本单位,它是程序执行时的一个实例。程序运行时系统就会创建一个进程,并为它分配资源,然后把该进程放入进程就绪队列,进程调度器选中它的时候就会为它分配CPU时间,程序开始真正运行。 Linux系统函数 fork() 可以在父进程中创建一个子进程,这样的话,在一个进程接到来自客户端新的请求时就可以复制出一个子进程让其来处理,父进程只需负责监控请求的到来,然后创建子进程让其去处理,这样就能做到并发处理。 # -*- coding:utf-8 -*- import os print('当前进程:%s 启动中 ....' % os.getpid()) pid = os.fork() if pid == 0: print('子进程:%s,父进程是:%s' % (os.getpid(), os.getppid())) else: print('进程:%s 创建了子进程:%s' % (os.getpid(),pid )) 输出结果: 当前进程:27223 启动中 .... 进程

一个用python写的比特币均线指标

天大地大妈咪最大 提交于 2020-02-28 14:20:39
https://blog.csdn.net/gsl222/article/details/104554397 https://github.com/yyy999/auto_ma912 一个用python写的比特币均线指标 开发环境:win10,spyder(anaconda3) #ET量化交易web系统: http://www.simplenet.top 安装与使用指南 Windows10 64位 环境 手动安装 1.下载并安装最新版spyder(Anaconda3) 64位 下载地址如下: Anaconda Distribution 2.下载本项目并解压所有文件 3.打开spyder加载本项目 在文件夹auto_ma913中找到ma_ind200227.py文件,单击运行。 贡献代码 auto_ma使用Github托管其源代码,如果希望贡献代码请使用github的PR(Pull Request)的流程: 创建 Issue - 对于较大的改动(如新功能,大型重构等)最好先开issue讨论一下,较小的improvement(如文档改进等)直接发PR即可 Fork ma_ind - 点击右上角Fork按钮 Clone你自己的fork: git clone https://github.com/$userid/auto_ma913.git 从dev创建你自己的feature branch

进程和线程

≯℡__Kan透↙ 提交于 2020-02-28 06:45:00
进程和线程: 1、进程概念: 进程:就是操作系统中执行的一个程序,操作系统以进程为单位分配存储空间,每个进程都有自己的地址空间、数据栈以及其他用于跟踪进程执行的辅助数据,操作系统管理所有进程的执行,为它们合理的分配资源。进程可以通过fork或spawn的方式来创建新的进程来执行其他的任务,不过新的进程也有自己独立的内存空间,因此必须通过进程间通信机制(IPC,Inter-Process Communication)来实现数据共享,具体的方式包括管道、信号、套接字、共享内存区等。 2、线程概念: 一个进程还可以拥有多个并发的执行线索,简单的说就是拥有多个可以获得CPU调度的执行单元,这就是所谓的线程。 3、多进程概念: Unix和Linux操作系统上提供了 fork() 系统调用来创建进程,调用 fork() 函数的是父进程,创建出的是子进程,子进程是父进程的一个拷贝,但是子进程拥有自己的PID。 fork() 函数非常特殊它会返回两次,父进程中可以通过 fork() 函数的返回值得到子进程的PID,而子进程中的返回值永远都是0。Python的os模块提供了 fork() 函数。由于Windows系统没有 fork() 调用,因此要实现跨平台的多进程编程,可以使用multiprocessing模块的 Process 类来创建子进程,而且该模块还提供了更高级的封装

Linux的进程管理

本秂侑毒 提交于 2020-02-27 18:29:12
copy from : http://gityuan.com/2017/08/05/linux-process-fork/ 基于Kernel 4.4源码 kernel/include/linux/sched.h kernel/include/linux/kthread.h kernel/arch/arm/include/asm/thread_info.h kernel/kernel/fork.c kernel/kernel/exit.c kernel/kernel/sched/core.c 一. 概述 Linux创建进程采用fork()和exec() fork: 采用复制当前进程的方式来创建子进程,此时子进程与父进程的区别仅在于pid, ppid以及资源统计量(比如挂起的信号) exec:读取可执行文件并载入地址空间执行;一般称之为exec函数族,有一系列exec开头的函数,比如execl, execve等 fork过程复制资源包括代码段,数据段,堆,栈。fork调用者所在进程便是父进程,新创建的进程便是子进程;在fork调用结束,从内核返回两次,一次继续执行父进程,一次进入执行子进程。 1.1 进程创建 Linux进程创建: 通过fork()系统调用创建进程 Linux用户级线程创建:通过pthread库中的pthread_create()创建线程 Linux内核线程创建:

Linux系统编程fork详解

烈酒焚心 提交于 2020-02-27 17:25:56
使用fork函数会创建一个和父进程相同的子进程。在调用了fork函数后,会先为子进程申请一个PID号,然后申请一个PCB结构,然后将父进程的PCB结构复制过来,对于父进程的虚拟空间内的内容用到了读时共享,写时复制的机制(下面会讲)。 #include <sys/types.h> #include <unistd.h> pid_t fork(void); 对于fork函数没有参数,会返回一个pid_t的参数用来表示创建的子进程的PID号。如果返回的pid_t等于0的话表示当前的进程是子进程,如果返回的pid_t是大于0的数说明当前的进程是父进程,如果返回-1说明出错并设置errno。示例代码如下: pid_t pid = fork(); if(pid > 0){ printf("This is father pid\n"); } else if(pid == 0){ printf("This is son pid\n"); } else{ perror("fork"); exit(1); } 此外还有两个函数可以用来查看当前的进程id和当前进程的父进程的id,分别是getpid()和getppid(),对应的参数如下: #include <sys/types.h> #include <unistd.h> pid_t getpid(void); pid_t getppid(void);