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

进程间通信概述



需要进程通信的原因:

数据传输

资源共享

通知事件

进程控制

Linux进程间通信(IPC)发展由来

Unix进程间通信

基于System V进程间通信(System V:UNIX系统的一个分支)

POSIX进程间通信(POSIX:可移植操作系统接口,为了提高UNIX环境下应用程序的可移植性。很多其他系统也支持POSIX标准(如:DEC OpenVMS和Windows)。)

现在Linux使用的进程间通信方式包括:

管道(pipe)、有名管道(FIFO)

信号(signal)

消息队列

共享内存

信号量

套接字(socket)

管道通讯



管道:单向的、先进先出的,把一个进程的输出和另一个进程的输入连接起来。一个进程(写进程)在管道尾部写入数据,另一个进程(读进程)从管道的头部读出数据。包括无名管道有名管道,无名管道只用于父进程和子进程间的通信,有名管道可用于运行同一系统中的任意两个进程间的通信。

管道的创建

无名管道创建

int pipe(int filedis[2]);   

int pipe_fd[2];if(pipe(pipe_fd)<0)
{
	printf("pipe create error\n");
	return -1;
}

当一个管道建立时,他会创建两个文件描述符,filedis[0]用于读管道,filedis[1]用于写管道。

管道的关闭

int close(); //使用close分别关闭两个文件描述符

当管道的一端被关闭后,下面两条规则起作用

1.当读(read)一个写端已被关闭的管道时,在所有数据都被读取后,read返回0,表示文件结束。

使用无名管道通信实例

通常,进程会先调用pipe,接着调用fork(这两步为了确保只生成一个管道,且子进程生成后能够继承文件描述符),从而创建从父进程到子进程的IPC管道。

 1 #include <unistd.h>
 2 #include <string.h>
 3 #include <sys/types.h>
 4 #include <errno.h>
 5 #include <stdio.h>
 6 #include <stdlib.h>
 7
 8 int main()
 9 {
10     int pipe_fd[2];
11     pid_t pid;
12     char buf_r[100];
13     char* p_wbuf;
14     int r_num;
15
16     memset(buf_r,0,sizeof(buf_r));
17
18     /*创建管道*/
19     if(pipe(pipe_fd)<0)
20     {
21         printf("pipe create error\n");
22         return -1;
23     }
24
25     /*创建子进程*/
26     if((pid=fork())==0)  //子进程
27     {
28         printf("\n");
29         close(pipe_fd[1]);    //写关闭
30         sleep(2); /*为什么要睡眠*/
31         if((r_num=read(pipe_fd[0],buf_r,100))>0)
32         {
33             printf(   "%d numbers read from the pipe is %s\n",r_num,buf_r);
34         }
35         close(pipe_fd[0]);
36         exit(0);
37       }
38     else if(pid>0)        //父进程
39     {
40         close(pipe_fd[0]);  //读关闭
41         if(write(pipe_fd[1],"Hello",5)!=-1)
42             printf("parent write1 Hello!\n");
43         if(write(pipe_fd[1]," Pipe",5)!=-1)
44             printf("parent write2 Pipe!\n");
45         close(pipe_fd[1]);
46         sleep(3);
47         waitpid(pid,NULL,0); /*等待子进程结束*/
48         exit(0);
49     }
50     return 0;
51 }

信号通讯



共享内存



消息队列



信号量



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

时间: 2024-10-18 01:42:46

Linux系统编程@进程通信(一)的相关文章

Linux系统编程——进程管理

引言: 在Linux的内核的五大组成模块中,进程管理模块时非常重要的一部分,它虽然不像内存管理.虚拟文件系统等模块那样复杂,也不像进程间通信模块那样条理化,但作为五大内核模块之一,进程管理对我们理解内核的运作.对于我们以后的编程非常重要.同时,作为五大组成模块中的核心模块,它与其他四个模块都有联系.下面就对进程模块进行想写的介绍,首先要了解进程及其相关的概念.其次介绍进程的创建.切换.撤销等基本操作.除此之外,还给出了Linux内核是如何对进程进行调度管理的.      一.进程及其相关概念 进

linux系统编程-进程

进程 现实生活中 在很多的场景中的事情都是同时进行的,比如开车的时候 手和脚共同来驾驶汽车,再比如唱歌跳舞也是同时进行的: 如下是一段视频,迈克杰克逊的一段视频: http://v.youku.com/v_show/id_XMzE5NjEzNjA0.html?&sid=40117&from=y1.2-1.999.6 试想:如果把唱歌和跳舞这2件事分开以此完成的话,估计就没有那么好的效果了 程序中 如下程序,来模拟"唱歌跳舞" 这件事情 11 from time impo

Linux系统编程——进程替换:exec 函数族

在 Windows 平台下.我们能够通过双击运行可运行程序.让这个可运行程序成为一个进程:而在 Linux 平台.我们能够通过 ./ 运行,让一个可运行程序成为一个进程. 可是,假设我们本来就执行着一个程序(进程),我们怎样在这个进程内部启动一个外部程序.由内核将这个外部程序读入内存,使其执行起来成为一个进程呢?这里我们通过 exec 函数族实现. exec 函数族.顾名思义.就是一簇函数,在 Linux 中,并不存在 exec() 函数.exec 指的是一组函数.一共同拥有 6 个: [cpp

Linux系统编程——进程的控制:结束进程、等待进程结束

结束进程 首先,我们回顾一下 C 语言中 continue, break, return 的作用: continue: 结束本次循环 break: 跳出整个循环,或跳出 switch() 语句 return: 结束当前函数 而我们可以通过 exit() 或 _exit() 来结束当前进程. 所需头文件: #include <stdlib.h> void exit(int value); 功能: 结束调用此函数的进程. 参数: status:返回给父进程的参数(低 8 位有效),至于这个参数是多

Linux系统编程——进程和线程的区别与联系

在许多经典的操作系统教科书中,总是把进程定义为程序的执行实例,它并不执行什么, 只是维护应用程序所需的各种资源,而线程则是真正的执行实体. 为了让进程完成一定的工作,进程必须至少包含一个线程. 进程,直观点说,保存在硬盘上的程序运行以后,会在内存空间里形成一个独立的内存体,这个内存体有自己的地址空间,有自己的堆,上级挂靠单位是操作系统.操作系统会以进程为单位,分配系统资源,所以我们也说,进程是资源分配的最小单位.更多详情,请看<进程的介绍>. 线程存在与进程当中,是操作系统调度执行的最小单位.

linux系统编程--进程相关概念

程序和进程 程序:二进制文件,占用的磁盘空间,还没运行 进程:启动的程序,数据在内存中,占用系统资源(CPU,物理内存) 并行和并发 并发:不是一个时间点的概念,而是一个时间段的概念,某个时间段内处理的请求数量 并行:增加服务器或cpu对请求的处理 一个cpu把一个时间段分成若干时间碎片,每个时间碎片只能处理一个进程,交替的处理进程 pcb(进程控制块) 常见内部成员: - 进程id - 进程的状态:初始,就绪,运行,挂起,终止 - 进程切换时,需要保存和恢复一些CPU寄存器 - 描述虚拟地址空

Linux系统编程——进程的介绍

http://my.9ku.com/fuyin/daogaoo.asp?dgid=564516 http://my.9ku.com/fuyin/daogaoo.asp?dgid=564608 http://my.9ku.com/fuyin/daogaoo.asp?dgid=564687 http://my.9ku.com/fuyin/daogaoo.asp?dgid=564782 http://my.9ku.com/fuyin/daogaoo.asp?dgid=564867 http://my.

Linux系统编程札记:进程通信(一) &nbsp; &nbsp;

进程简单来讲就是一个程序的一次执行,这里说的进程一般都指的是运行在用户态的进程,而处于用户态的不同进程之间是彼此相互隔离的,它们必须通过某种方式来进行通信,具体理由如下: (1)数据传输:有时候一个进程需要将它的数据发送给另一个进程. (2)资源共享:有时候多个进程之间需要共享同样的资源. (3)通知事件:有时候一个进程需要向另一个或一组进程发送消息,通知它们发生了某个事件. (4)进程控制:有些进程希望能够完全控制另一个进程的执行,此时控制进程希望能够拦截另一进程的所有操作,并能够及时知道它的

Linux编程---进程通信

Linux的通信方式主要有分类有下面几种: -匿名管道和FIFO有名管道 -消息队列,信号量和共享存储 -套接字 .对于套接字的进程通信,我就留在套接字的文章中再写了. 一.管道 管道是最古老的进程通信机制了.提供进程间的单向通信. 1.创建管道 int pipe(int fdes[2]); 实际上管道通过参数返回读和写的两个文件描述符.相当于是打开了两个文件吧.但是这个文件是特殊的pipe文件.fdes[0]表示的是输入,fdes[2]表示的是输出.注意,这个函数只创建一个文件,而不是创建两个