参考: LInux C编程从初学到精通 电子工业出版社

Linux 进程

Linux 进程简介

Linux是一个多用户多任务的操作系统,多用户是指多个用户可以在同一时间使用同一台计算机系统;多用户是指Linux可以同时执行几个任务,它可以在还未执行完一个任务时又执行另一个任务,操作系统管理着多个用户的请求和多个任务。

Linux系统中所有运行的东西都可以称之为一个进程。每个用户任务、每个系统管理,都可以称之为进程,Linux用分时管理方法使所有的任务共同分享系统资源。

归结起来,进程具有以下4个要素:

  1. 要有一段程序供该进程运行。
  2. 进程专用的系统堆栈空间。
  3. 进程控制块(PCB),在Linux中的具体实现是task_struct结构。
  4. 有独立的存储空间。

Linux操作系统包括三种不同类型的进程,每种进程都有自己的特点和属性:

  1. 交互进程:由一个shell启动的进程。交互进程既可以在前台运行,也可以在后台运行。
  2. 批处理进程:这种进程和终端没有联系,是一个进程序列
  3. 监控进程(守护进程):Linux系统启动时启动的进程,并在后台运行。

进程相关的主要函数

fork() 创建一个子进程,若成功,父进程中返回子进程id,子进程中返回0;若出错则返回-1;

#include<sys/types.h>
#include<unistd.h>
pid_t fork(void);

需要注意:

  1. fork()系统调用的作用是复制一个进程。当一个进程调用它,完成后就会出现两个几乎一摸一样的进程。
  2. fork()函数被调用一次,但是返回两次。在子进程中返回的是0,在父进程中返回的是子进程id。

getpid() 返回进程的进程id

#include<sys/types.h>
#include<unistd.h>
pid_t getpid(void);

exec函数族

#include<unistd.h>
int execl(const char*pathname, const char *arg, ...);
int execlp(const char*filename, const char *arg, ...);
int execle(const char*pathname, const char*arg, ..., char *const envp[]);
int execv(const char*pathname, char*const argv[]);
int execvp(const char*filename, char*const argv[]);
int execve(const char*pathname, char*const argv[], char*cons envp[]);

6 个函数若成功则无返回值,若出错返回-1;

需要注意:

  1. 函数名中有字母 ‘l’ 的,其参数个数不定,参数由所调用程序的命令行参数列表组成,最后一个NULL表示结束。
  2. 函数名中有字母 ‘v’ 的,则是使用一个字符串数组指针argv指向参数列表,这一字符串数组和含有字母 ‘l’ 的函数中的参数列表完全相同,也同样以NULL结束。
  3. 函数名中有字母 ‘p’ 的,可以自动在环境变量PATH指定的路径中搜索要执行的程序,因此它的第一个参数为filename,表示可执行程序的文件名。而其他函数则需要用户在参数中指定该程序,所以其第一个参数为pathname。
  4. 函数名中含有 ’e’ 的,比其他函数多含有一个参数envp,这是一个字符串数组指针,用于指定环境变量。调用这样的函数(execle和execve)时,可以由用户自行设定子进程的环境变量,存放在参数的envp所指向的字符串数组中。这个字符串数组也必须由NULL结束。其他函数则是接受当前的环境变量。

简单示例:

#include<stdio.h>
#include<unistd.h>int main(){//char *envp[]={"THIS=test",NULL};//char *argv[]={"echo","this is a test",NULL};//char *argve[]={"env",NULL};//execl("/usr/bin/ls","ls","-a",NULL);//execlp("echo","echo","this is a test",NULL);    //execle("/usr/bin/env","env",NULL,envp);//execv("/bin/echo",argv);//execvp("echo",argv);//execve("/usr/bin/env",argve,envp);return 0;
}

普遍情况下,如果一个进程想要执行另一个程序,它可以fork一个新进程,然后调用任何一个exec(使用system函数更简单)。

**exit(int) 终止一个进程 **

#include<stdlib.h>
void exit(int status);

在一个进程调用了exit之后,该进程并非马上就消失掉,而是留下一个僵尸进程的数据结构。

wait和waitpid函数:进程等待的系统调用

#include<sys/types.h>
#include<sys/wait.h>
pid_t wait(int *status);
pid_t waitpid(pid_t pid, int *status, int options);

两函数:若成功则返回进程id,若出错则返回-1;
对于waitpid如果设置了WNOHANG选项,返回0表示没有已退出的子进程可收集。

需要注意:

  1. 系统一旦调用了wait,就立即阻塞自己,由wait自动分析是否当前进程中的某个子进程已经退出,如果让它找到了这样一个已经变成僵尸的子进程,wait就会手机这个子进程的信息,并把它彻底销毁后返回,如果没有找到这样一个子进程,wait就会一直阻塞在这里。
  2. 从本质上讲waitpid和wait的作用是完全相同的,但waitpid多了两个可由用户控制的参数pid和options,从而为用户变成提供了一种更为灵活的方式。

pid取值及其含义:
options选项:
WNOHANG:即使没有子进程退出,它也会立即返回
WUNTRRACED:极少用到

进程之间的通信

管道

Linux环境下使用pipe函数创建一个匿名管道,其函数原型如下:

#include<unistd.h>
int pipe(int fd[2]);

参数fd[2]是一个长度为2的文件描述符数组,fd[0]是读出端的文件描述符,fd[1]是写入端的文件描述符。

管道的读写
可以使用read和write函数对管道进行读写操作,需要注意的是,管道的两端是固定了任务的,即管道的读写端智能用于读取数据,管道的写入端则只能用于写入数据。如果试图从管道写端读取数据,或者和向管道读端写入数据都将导致错误发生。

父子进程之间通信:

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>int main(){ int fd[2];char inbuf[256]="this is a test!\n";char outbuf[256]={0};pid_t pid;int len;if(pipe(fd)<0){printf("create the pipe failed!\n");exit(1);}if((pid=fork())<0){printf("fork failed!\n");exit(1);}else if(pid>0){close(fd[0]);write(fd[1],inbuf,16);exit(0);}else{close(fd[1]);len=read(fd[0],outbuf,256);if(len<0){printf("read pipe failed\n");exit(1);}printf("%s",outbuf);}return 0;
}

兄弟进程之间通信

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>int main(){int fd[2];char inbuf[256]="this is a test!\n";char outbuf[256]={0};int len;pid_t pid;if(pipe(fd)<0){printf("create pipe failed!\n");exit(1);}if((pid=fork())<0){printf("fork failed!\n");exit(1);}else if(pid==0){close(fd[0]);write(fd[1],inbuf,16);exit(0);}if((pid=fork())<0){printf("fork failed!\n");exit(1);}else if(pid==0){close(fd[1]);len=read(fd[0],outbuf,256);printf("%s",outbuf);}close(fd[0]);close(fd[1]);return 0;
}

Linux 进程及进程之间的通信机制——管道相关推荐

  1. linux的进程与库之间的通信两种方式

    文章目录 前言 一.进程A与算法库b的通信方式之一:动态dlopen加载算法库b,编译的时候是需要加载该头文件就可以,无需连接该算法库b 具体的实施细节: 二.进程A与算法库b的通信方式之二:进程A编 ...

  2. Linux上如何测试服务器之间的通信

    我们在开发中常常需要测试服务器之间的连通性,下面我给大家分享一下我的经验,常用方法有四个 方法1 使用ping命令,但是这个命令只能简单的测试服务器之间是否具备通信能力,使用方法如下 ping 192 ...

  3. linux 进程通信机制,LINUX内核进程高效通信机制研究

    摘要:进程间的通信是多任务.多用户操作系统必须考虑的重大问题,Linux继承了Unix的基本设计思想,其安全性和稳定性得到了人们的认可,但随着其应用领域的不断拓展,其通信机制已经不能满足用户的需求.本 ...

  4. 【Linux系统编程】进程通信之管道

    1.进程间通信介绍 1.1 进程通信的基本概念 在之前我们已经学习过进程地址空间.Linux 环境下,进程地址空间相互独立,每个进程各自有不同的用户地址空间.任何一个进程的全局变量在另一个进程中都看不 ...

  5. linux应用之----进程通信

    进程间通信基础 进程间通信的英文缩写: IPC 为什么需要进程间通信?数据传输,资源共享,通知事件,进程控制等. Linux进程间通信方式(6种):管道,信号,消息队列,共享内存,信号量,套接字. 各 ...

  6. MultiProcessing中主进程与子进程之间通过管道(Pipe)通信

    Python 中 Multiprocessing 实现进程通信 1. 如何建立主进程与子进程之间的通信管道? 2. 为什么一定要将Pipe中的某些端close()? 本文参考自:python 学习笔记 ...

  7. Python 中的多进程(进程之间的通信)

    文章目录 在进程之间共享数据 共享内存 服务器进程 进程之间的通信 队列 管道 这篇文章将会讲解在 Python 中使用 多进程模块时在进程之间共享数据和消息传递的概念. 在多处理中,任何新创建的进程 ...

  8. linux通信机制总结

    目录 1. Linux通信机制分类简介 2. Inter-Process Communication (IPC) mechanisms: 进程间通信机制0x1: 信号量(Signals)0x2: 管道 ...

  9. 在线实时大数据平台Storm并行和通信机制理解

    1.storm系统角色和应用组件基本理解: 和Hadoop一起理解,清晰点. 1)物理节点Nimubus,负责资源分配和任务调度: 2)物理节点Supervisor负责接受nimbus分配的任务,启动 ...

最新文章

  1. 屏幕输出语句_2.2 数据输入与输出
  2. 卡牌特效: svg不规则倒计时动效
  3. 信息系统项目管理系列之二:项目生命期和组织
  4. windows pip命令不见了_Python中Pygame以及pip的下载与安装
  5. 数据科学 IPython 笔记本 8.11 多个子图
  6. ajax请求成功后返回值如何赋值给js变量
  7. VS2010-MFC(MFC常用类:MFC异常处理)
  8. ubuntu14.04中安装opencv2.4.11
  9. iSCSI客户端配置
  10. Excel零基础入门(真对2021版Excel)
  11. 通过淘宝数据学习爬虫,python scrapy requests与response对象
  12. 图像降噪(去噪)是什么原理?
  13. 企业精益生产之成本管理控制的四大要点
  14. PHP MySQL 连接数据库
  15. matlab 冲激偶,冲激函数符号怎么念 什么是冲激函数?
  16. 【超详细】Linux内核树的构建
  17. AJax 中的 xhr.states 和 xhr.status
  18. 角平分线上的点到角两边的距离相等易混淆点
  19. 圣经不是一本书,而是一个图书馆,所以才这么难读
  20. 会计学原理学习笔记——第一章——总论(1.9会计核算方法)

热门文章

  1. 源程序,解释器,编译器
  2. 《Java程序设计》第十一周学习总结
  3. oracle sql 获取本季度所有月份,上季度所有月份
  4. Oracle数据库导入导出命令!
  5. 02---控制移动底座1
  6. 接口与抽象类的使用选择
  7. codeforces水题100道 第二十七题 Codeforces Round #172 (Div. 2) A. Word Capitalization (strings)...
  8. oracle实例没有连到监听上6,oracle LISTENER未监听到oracle实例问题解决
  9. python3 opencv_Python3 OpenCV3 图像处理基础
  10. java datahandler_Java Web Services:使用DataHandler类发送文件