基本操作命令:

ps -ajx/-aux/-ef 查看进程间状态/的相互关系

top 动态显示系统中的进程

nice 按照指定的优先级运行 /renice 改变正在运行的进程的优先级

kill -9杀死进程

jobs 查看后台进程数

进程的结构、类型、状态、模式

0.Linux中进程包括三段:

(1)数据段。存放的是全局变量,常量以及动态内存的数据空间。

(2)正文段。存放的是程序中的代码。

(3)堆栈段。存放的是函数的返回地址,函数的参数以及局部变量。

进程类型:交互进程,既可以在前台运行,也可以在后台运行。该类进程是由shell控制和运行的。

批处理进程,不属于某个终端,被提交到一个队列中以便顺序执行。

守护进程:系统开始时执行,系统关闭时结束。

1.系统中专用的进程:

(1)ID为0的进程是调度进程,通常称为交换进程,该进程是内核的一部分,它并不执行任何磁盘上的程序,因此也被称为系统进程。

(2)ID为1 的进程是init进程,init进程通常读与系统有关的初始化文件,并将系统引导到一个状态。init进程绝不会终止,init进程是所有孤儿进程的父进程。

(3)ID为2的进程是页守护进程,此进程负责支持虚拟存储系统的分页操作。

  2.子进程是父进程的副本,子进程获得父进程的数据空间,堆和栈的副本。这是子进程拥有的独立的空间。父子进程并不共享这些存储空间,父子进程共享正文段。fork之后到底是先执行父进程还是子进程是不一定的,取决于内核所使用的调度算法,如果要求父子进程之间相互同步,则要求进程间的通信。

vfork也能创建进程,但是不能产生父进程的副本,当子进程需要改变内存中的数据时,才拷贝父进程。

父进程与子进程的区别:

fork的返回值不同;

   进程ID不同;

  父进程设置的文件锁不会被子进程继承;

   子进程未处理的闹钟被清除;

  子进程未处理的信号集设置为空集。

(1)孤儿进程:对于所有父进程终止的所有进程,他们的父进程都变为init进程。init无论何时只要有一个进程终止,init就会调用一个wait函数取得其终止状态。这样就防止了系统中好多个僵尸进程。

(2)僵尸进程:子进程结束,父进程没有收尸。

(3)进程间数据共享。

exec函数族:当进程认为自己不能为系统和用户做出任何贡献的时候,就可以调用exec函数族,让自己执行新的程序。如果某个进程在执行一个程序的时候想执行另一个程序,则首先创建子进程,在子进程中间调用exec函数。在用exec函数是要加上出错判断。

传统的进程间通信

(1)无名管道:无名管道是半双工的,数据只能想一个方向流动,具有固定的读端和写端;无名管道只能用于父子进程或者兄弟进程(具有亲缘关系的进程)之间。

无名管道单独构成一种独立的文件系统;管道是基于文件描述符的通信方式,当一个管道建立时,它会创建两个文件描述符,其中fd[0] 固定于读管道,fd[1] 固定于写管道。管道只存在于内存中。

管道的读写:

管道是一种文件,因此对管道的读写同read()和write()函数。

一个进程向管道中写得内容被管道的另一端进程读出。写入的内容每次都添加在管道的尾端,并且每次都是从缓冲区的头部读出数据。

当父子进程对管道进程读写的时候,如果父进程执行写操作,则关闭相应的读管道的文件描述符;而子进程进行写操作,它将关闭相应的读操作。

当管道为空的时候,读操作会阻塞,向管道中写数据的时候Linux操作系统不保证写入的原子操作,管道中只要有空闲区域写进程会试图向管道中写入数据。如果读操作不读走缓冲区的数据,则写操作一直会阻塞。只有在读管道存在时,写管道才有意义,不

然则会受到系统发出的SIGPIPE信号(管道破裂)。应用程序可以处理该信号,也可以忽略(默认动作则是终止程序)。

#include <unistd.h>

int pipe(int fd[2])

(2)有名管道:不同于有名管道之处在于它提供一个路径名与之关联,有名管道可以使不相关的进程之间进行通信。以FIFO的文件形式存在于文件系统中。

注意:FIFO严格遵循先进先出,对管道及FIFO的读总是从开始处返回数据,对他们的写则是把数据添加到末尾。不支持lseek()等文件操作。

#include <sys/types.h>

#include <sys/stat.h>

int mkfifo(const char * pathname, mode_t mode)

该函数的第一个参数是一个普通的路径名,也就是创建后FIFO的名字。第二个参数与打开普通文件的open()函数中的mode 参数相同。如果mkfifo的第一个参数是一个已经存在的路径名时,会返回EEXIST错误,所以一般典型的调用代码首先会检查是否返回该错误,如果确实返回该错误,那么只要调用打开FIFO的函数就可以了。一般文件的I/O函数都可以用于FIFO,如close、read、write等等

无名管道由一个在基本文件系统存储设备上的INODE,一个与其相连的内存INODE,两个打开文件控制块(分别对应管道的信息发送端和信息接收端)及其所属进程的描述信息来标识,在系统执行PIPE(P)命令行之后生成。并在P[0]中返回管道的读通道打开文件描述等,在P[1]中返回管道的写通道打开文件描述符。从结构上看,无名管道没有文件路径名,不占用文件目录项,因此文件目录结构中的链表不适用于这种文件,它只是存在于打开文件结构中的一个临时文件,随其所依附的进程的生存而生存,当进程终止时,无名管道也随之消亡。

送入管道的信息一旦被读进程取用就从管道中消失了,读写操作之间符合先进先出的队列原则。

管道文件是进程间通信的工具,为了尽量少的占用系统存储资源,一般系统均将其限制为最大长度为4096(PIPSIZ)字节的小型文件。当欲写入的消息超过4096字节时,就产生了读、写进程之间的同步问题。首先写操作查找PIPE文件中当前指针的偏移量F-OFFSET,然后从此位置开始尽量写入信息,当长度达到4096字节时,系统控制写进程进入睡眠状态,一直等待读进程取走全部信息时,文件长度指针置0,写进程才被唤醒继续工作。

为防止多个进程同时读写一个管道文件而产生混乱,在管道文件的INODE标志字I-FLAY项中设置了ILOCK标志项,以设置软件锁的方式实现多进程间对管道文件的互斥使用。

无名管道存在着如下两个严重的缺点。

第一,无名管道只能用于连接具有共同祖先的进程。

第二,无名管道是依附进程而临时存在的。所以后来推出了一种无名管道的变种-有名管道,它常被称为FIFO。有名管道除继承了无名管道的所有特性优点之外,还屏弃了无名管道的两个缺点。

首先,FIFO是一种永久性的机构,它具有普通的UNIX系统文件名。在系统下可利用MKNOD命令建立永久的管道,除非刻意删除它,否则它将一直保持在系统中。

其次,正是由于有名管道以“文件名”来标识,所以只要事先约定某一特定文件名,那样所有知道该约定的服务进程,不论它们之间是否有亲属关系,都可以便利地利用管道进行通信。

通过下面的命令可以创建一个命名管道:

/etc/mknod pipe_name p

其中“pipe_name”是要创建的命名管道的名字,参数p 必须出现在命名管道名字之后。

named pipes(命名管道)管道具有很好的使用灵活性,表现在:

1) 既可用于本地,又可用于网络。

2) 可以通过它的名称而被引用。

3) 支持多客户机连接。

4) 支持双向通信。

5) 支持异步重叠I/O操作。

无名管道与有名管道的异同:

1.通信方式;

2.进程是否相关;

3.存在区域不同;

4.存在周期不同;

相同点:

1.都是先进先出;

2.管道的容量相同;

Linux系统编程——进程间通信(一)的更多相关文章

  1. linux系统编程--进程间通信

    IPC方法 Linux环境下,进程地址空间相互独立,每个进程各自有不同的用户地址空间.任何一个进程的全局变量在另一个进程中都看不到,所以进程和进程之间不能相互访问, 要交换数据必须通过内核,在内核中开 ...

  2. Linux系统编程——进程间通信:信号中断处理

    什么是信号? 信号是 Linux 进程间通信的最古老的方式.信号是url=474nN303T2Oe2ehYZjkrggeXCaJPDSrmM5Unoh4TTuty4wSgS0nl4-vl43AGMFb ...

  3. Linux系统编程——进程间通信:管道(pipe)

    管道的概述 管道也叫无名管道,它是是 UNIX 系统 IPC(进程间通信) 的最古老形式,全部的 UNIX 系统都支持这样的通信机制. 无名管道有例如以下特点: 1.半双工,数据在同一时刻仅仅能在一个 ...

  4. Linux系统编程——进程间通信(System V IPC 对象)

    基本查看命令 ipcs  -m查看共享内存        ipcs -s查看信号量        ipcs -q查看消息队列 ipcrm  -m  id 删除共享内存   -M+key值 ipcrm ...

  5. Linux系统编程——进程间通信:共享内存

    概述 url=MdyPihmS_tWLwgWL5CMzaTrwDFHu6euAJJUAjKvlzbJmRw7RfhmkBWwAloo7Y65hLY-kQdHsbqWYP2wc2fk8yq"& ...

  6. Linux系统编程——进程间通信:命名管道(FIFO)

    命名管道的概述 无名管道,因为没有名字,仅仅能用于亲缘关系的进程间通信(很多其它详情.请看<无名管道>).为了克服这个缺点.提出了命名管道(FIFO).也叫有名管道.FIFO 文件. 命名 ...

  7. Linux系统编程温故知新系列 --- 01

    1.大端法与小端法 大端法:按照从最高有效字节到最低有效字节的顺序存储,称为大端法 小端法:按照从最低有效字节到最高有效字节的顺序存储,称为小端法 网际协议使用大端字节序来传送TCP分节中的多字节整数 ...

  8. Linux系统编程@进程通信(一)

    进程间通信概述 需要进程通信的原因: 数据传输 资源共享 通知事件 进程控制 Linux进程间通信(IPC)发展由来 Unix进程间通信 基于System V进程间通信(System V:UNIX系统 ...

  9. 《Linux系统编程(第2版)》

    <Linux系统编程(第2版)> 基本信息 作者: (美)Robert Love 译者: 祝洪凯 李妹芳 付途 出版社:人民邮电出版社 ISBN:9787115346353 上架时间:20 ...

随机推荐

  1. Elasticsearch Query DSL备忘(1)(Constant score query和Bool Query)

    Query DSL (Domain Specific Language),基于json的查询方式 1.Constant score query,常量分值查询,目的就是返回指定的score,一般都结合f ...

  2. HDU.1596 find the safest road (Floyd)

    HDU.1596 find the safest road (Floyd) 题意分析 与普通的最短路不太相同,本题有些许的变化. 1. 要找到由i到j最安全的路,故在求解的时候要保证mp[i][j]尽 ...

  3. AOJ.863 分书问题 (DFS)

    题意分析 现有n个人,n种书,给出每人对n种书的喜欢列表,求有多少种方案满足以下条件: 1.每个人都分得自己喜欢的书: 2.每个人分得书的种类各不相同,即所有种类的书均得到分配 1.采用生成测试法 生 ...

  4. React受控组件和非受控组件

    受控组件和非受控组件主要是用来解决表单组件状态谁来控制的问题.因为用户的输入会反应在界面上,相当于视图的状态发生了变化,而react是通过虚拟DOM比对修改视图的,这里就要决定谁来控制表单组件的状态. ...

  5. 51nod 1275 连续子段的差异(twopointer+单调队列)

    对于每一个i找到最近的j满足最大值-最小值>K,对答案的贡献为j-i,用单调队列维护最值即可 #include<iostream> #include<cstdlib> # ...

  6. 剑桥offer(21~30)

    21.题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba.   还不 ...

  7. JavaScript URL汉字编码转换

    在使用url进行参数传递时,经常会传递一些中文名的参数或URL地址,在后台处理时会发生转换错误.在有些传递页面使用GB2312,而在接收页面使用UTF8,这样接收到的参数就可能会与原来发生不一致.使用 ...

  8. idea 多模块引用

    roma-server 引用common-utils的类,所以在roma-server 的pom中配置 <dependency> <groupId>org.springfram ...

  9. 「模板」 线段树——区间乘 && 区间加 && 区间求和

    「模板」 线段树--区间乘 && 区间加 && 区间求和 原来的代码太恶心了,重贴一遍. #include <cstdio> int n,m; long l ...

  10. jQuery拖拽 & 弹出层

    了解更多请查看 官网 和 API iDrag & iDialog 介绍 特点: iDialog.js依赖于jquery编写的简单易用的对话框,同时还可以通过添加css3,改变对话框的展现动画. ...