1、进程和程序

程序是一个可执行文件,而一个进程是一个执行中的程序实例。一个进程对应于一个程序的执行,进程是动态的,程序是静态的,多个进程可以并发执行同一个程序。比如几个用户可以同时运行一个编辑程序,每个用户对此程序的执行均作为一个单独的进程。

2、进程控制的系统调用
一个进程可以启动另一个进程,进程之间形成层次结构,而进程树的顶端是一个控制进程,一个名为Init的程序的执行,该进程是所有用户进程的祖先。主要的系统调用有

  • fork()   通过复制调用进程来建立新的 进程,是最基本的进程建立操作
  • exec   包含一系列的系统调用,通过用一个新的程序覆盖原内存空间来实现进程的转变
  • wait()  提供初级的进程同步措施,使一个进程等待,直到另一个进程结束为止
  • exit()  终止一个进程的实现

3、进程的建立

进程的创建是通过调用fork()来创建,创建进程的那个进程成为父进程,创建出来的新的进程成为子进程,pid = fork(),返回值为进程标识符,如果返回的非零整数,则表明是父进程,返回的是0,则为子进程。

4、进程的运行

exec系列中的系统调用完成将一个新程序装入调用进程的内存空间,来改变调用进程的执行代码,从而形成新的 进程。exec调用成功,那么调用进程则会被覆盖,然后从新程序的入口开始执行,但其进程标识符与调用进程相同。

所以,exec调用成功后无任何数据返回,这与fork()不同

5、进程的终止

系统调用exit()实现进程的终止,成功返回0,出错则返回非0值,exit()除了停止进程外,还可以关闭所有已打开的文件,若父进程因执行了wait()调用而处于睡眠状态,那么子进程执行exit()会重新启动父进程运行,另外,exit()还将完成一些系统内部的清除工作,例如缓冲区的清除工作等

除了exit()外,当进程运行完其程序到达main函数末尾时,进程会自动终止,当进程在main函数内执行一个return语句时,也会终止。当然还有一个_exit()函数也可以终止进程,其与exit()相同,但没有系统内部的清除工作。

进程终止的特殊情况:

1)子进程终止时,父进程并不正在执行wait()调用。

2)当子进程尚未终止时,父进程却终止了。一般允许父进程终止,并把它的子进程交给系统的初始化进程所属

6、进程的同步

使用wait()是实现进程同步的简单手段

7、进程的优先级

通过nice()调整进程的优先数,如nice(5)则是增加优先数,优先数越大,进程优先权就越低,所以nice()输入一个正数是降低了进程从优先权,普通进程只能降低优先权,超级用户可以通过输入一个负值,比如nice(-1)来增加优先权

8、守护进程

守护进程是一种后台运行并且独立于所有终端控制之外的进程,有很多守护进程,执行着各种系统服务和管理的任务,那么为什么要独立于终端之外的进程呢?

1)安全性考虑----进程执行信息不显示在任何一个终端上

2)不被打断----避免进程被终端的中断信号打断

3)方便转入后台---可以通过&将程序转为后台执行,有时也希望程序能够自动将其转入后台执行

9、守护进程的启动

1)通过系统的初始化脚本启动------脚本目录通常在etc/rc.d下,这种守护进程有超级用户权限

2)通过inetd启动   --- 很多网络服务程序是由inetd守护程序启动的

3)由cron定时启动的处理程序

4)由at启动的处理程序

5)终端启动---通常只用于守护进程的测试或者重启进程

6)终端上用nohup启动的进程 ---- 这种方法可以将所有程序变为守护进程

Linux网络编程学习(二) ----- 进程控制(第三章)的更多相关文章

  1. Linux网络编程学习(九) ----- 消息队列(第四章)

    1.System V IPC System V中引入的几种新的进程间通信方式,消息队列,信号量和共享内存,统称为System V IPC,其具体实例在内核中是以对象的形式出现的,称为IPC 对象,每个 ...

  2. Linux网络编程学习(七) ----- 有名管道(第四章)

    1.什么是有名管道?为什么有了管道还需要有名管道? 有名管道是解决管道不能提供非父子进程间通信的缺陷.管道在Linux系统内部是以文件节点(inode)的形式存在,但由于其对外的不可见性(“无名”性) ...

  3. Linux网络编程学习计划

    由于网络编程是很重要的一块,自己这一块也比较欠缺,只知道一些皮毛,从今天开始系统学习<Linux网络编程>一书,全书分为十四个章节: 第一章   概论   P1-16 第二章   UNIX ...

  4. Linux网络编程学习路线

    转载自:https://blog.csdn.net/lianghe_work/article 一.网络应用层编程   1.Linux网络编程01——网络协议入门 2.Linux网络编程02——无连接和 ...

  5. Linux网络编程学习(三) ----- 进程控制实例(第三章)

    本节主要介绍一个进程控制的实例,功能就是在前台或者后台接收命令并执行命令,还能处理由若干个命令组成的命令行,该程序命名为samllsh. 基本逻辑就是 while(EOF not typed) { 从 ...

  6. Linux网络编程学习(十二) ----- 结语

    该书提前看完了,重点看了第四章和第六章,第七章以后只是大致浏览了一下,如果以后工作中涉及这一块再仔细研究一下,大概花了二十天的样子,主要了解了进程间的通信方式.socket编程以及五种I/O模式,看的 ...

  7. linux网络编程学习笔记之二 -----错误异常处理和各种碎碎(更新中)

    errno 在unix系统中对大部分系统调用非正常返回时,通常返回值为-1.并设置全局变量errno(errno.h),如socket(), bind(), accept(), listen(). e ...

  8. Linux网络编程学习(四) -----守护进程的建立(第三章)

    本文介绍一个例程daemon_init() #include <sys/types.h> #include <signal.h> #include <unistd.h&g ...

  9. linux网络编程学习笔记之五 -----并发机制与线程�

    进程线程分配方式 简述下常见的进程和线程分配方式:(好吧,我仅仅是举几个样例作为笔记...并发的水太深了,不敢妄谈...) 1.进程线程预分配 简言之,当I/O开销大于计算开销且并发量较大时,为了节省 ...

随机推荐

  1. 基于Verilog的简单FIFO读写实验

    一.模块框图及基本思路 fifo_ip:ISE生成的IP fifo_control:在fifo未满情况下不断写入递增的四位数,每隔1s读出一个数据驱动Led显示 fifo_top:前两个模块的组合 二 ...

  2. 微信小程序用setData给数组对象赋值

    假如现在要给数组marker中的对象属性赋值 data: { marker: [ { latitude: ' ' , longitude: ' ' } ] },   在方法中的写法为   fetchJ ...

  3. SQL注入之Sqli-labs系列第三十二关(基于宽字符逃逸注入)

    开始挑战第三十二关(Bypass addslashes) 0x1查看源代码 (1)代码关键点 很明显,代码中利用正则匹配将 [ /,'," ]这些三个符号都过滤掉了 function che ...

  4. (转)junit简介

    什么是单元测试? 所谓单元测试是测试应用程序的功能是否能够按需要正常运行,并且确保是在开发人员的水平上,单元测试生成图片.单元测试是一个对单一实体(类或方法)的测试.单元测试是每个软件公司提高产品质量 ...

  5. 【Java】字节数组转换工具类

    import org.apache.commons.lang.ArrayUtils; import java.nio.charset.Charset; /** * 字节数组转换工具类 */ publi ...

  6. node day2 vue read html

    app.js var http = require("http"); var fs = require('fs'); var url = require('url'); http. ...

  7. jQeury 批量删除

    /*批量删除*/ function datadel(){ var ids = new Array(); $("input[name='batch']:checked").each( ...

  8. zabbix图形化界面乱码(二)

      中文字体乱码,解决办法:   1:从Windos下拷贝字体到服务器,C:\Windows\Fonts,有很多,看着喜欢的拷贝   2:然后在zabbix 服务端,进入到zabbix web的工作目 ...

  9. 迷宫问题bfs, A Knight's Journey(dfs)

    迷宫问题(bfs) POJ - 3984   #include <iostream> #include <queue> #include <stack> #incl ...

  10. Linux whereis命令详解

    Linux whereis命令 Linux whereis命令用于查找文件. 该指令会在特定目录中查找符合条件的文件.这些文件应属于原始代码.二进制文件,或是帮助文件. 该指令只能用于查找二进制文件. ...