Linux 进程间通信(IPC)

Linux 进程间通信(IPC):

Linux系统中除了进程和进程之间通信,我想大家也应该关注用户空间与内核空间是如何通信的,比方说netlink等等。除了传统进程间通信外像Socket通信也需要掌握的!

/*--------------------------------------------------------------------------
 * Project: aipc.c
 * Name: zwp
 * Date: 2014/6
 *-------------------------------------------------------------------------*/

#include <sys/types.h>
#include <sys/wait.h>
#include <sys/socket.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
#include <stdio.h>

#define MAXLINE	1024

static void sig_pipe(int);

int s_pipe(int fd[2]);

int main(void)
{
	int	n, fd[2];
	pid_t	pid;
	char	line[MAXLINE];

	if(signal(SIGPIPE, sig_pipe) == SIG_ERR)
		printf("signal error...\n");
	if(s_pipe(fd) < 0)
		printf("pipe error...\n");
	else if(pid > 0)
	{
		close(fd[1]);
		while(fgets(line, MAXLINE, stdin) != NULL)
		{
			n = strlen(line);

			if(write(fd[0], line, MAXLINE) != n)
				printf("write error from pipe...\n");
			if((n = read(fd[0], line, MAXLINE)) < 0)
				printf("read arror from pipe...\n");
			if(n == 0)
			{
				printf("child closed pipe...\n");
				break;
			}
			line[n] = 0;
			if(fputs(line, stdout) == EOF)
				printf("fputs error...\n");
		}
		if(ferror(stdin))
			printf("fgets error on stdin...\n");

		exit(0);

	}
	else
	{
		close(fd[0]);
		if(fd[1] != STDIN_FILENO)
		{
			if(dup2(fd[1], STDIN_FILENO) != STDIN_FILENO)
				printf("dup2 error to stdin...\n");

		}
		if(fd[1] != STDOUT_FILENO)
		{
			if(dup2(fd[1], STDOUT_FILENO) != STDOUT_FILENO)
				printf("dup2 error tostdout..\n");

		}
		if(execl("./add2", "add2", NULL) < 0)
			printf("execl error...\n");

	}

}

int s_pipe(int fd[2])
{
	return (socketpair(AF_UNIX, SOCK_STREAM, 0, fd));

}

static void sig_pipe(int sign)
{
	printf("SIGPIPE caught...\n");
	exit(1);

}

Linux 进程间通信(IPC)

时间: 2024-12-20 12:55:26

Linux 进程间通信(IPC)的相关文章

Linux进程间通信(IPC)简介

Linux IPC的发展 Linux下的进程通信手段基本上是从UNIX平台上的进程通信手段继承而来的.而对UNIX发展做出重大贡献的两大主力AT&T的贝尔实验室及BSD(加州大学伯克利分校的伯克利软件发布中心)在进程间的通信方面的侧重点有所不同.前者是对UNIX早期的进程间通信手段进行了系统的改进和扩充,形成了"system V IPC",其通信进程主要局限在单个计算机内:而BSD则跳过了该限制,形成了基于套接口(socket)的进程间通信机制.而Linux则把两者的优势都继承

Linux进程间通信(IPC)机制总览

Linux进程间通信 Ø  管道与消息队列 ü  匿名管道,命名管道 ü  消息队列 Ø  信号 ü  信号基础 ü  信号应用 Ø  锁与信号灯 ü  记录锁 ü  有名信号灯 ü  无名信号灯(基于内存的信号灯) Ø  共享内存 ü  共享内存介绍 ü  文件映射内存方式 ü  共享内存对象方式 为什么需要进程间通信 Ø  数据传输代表:管道 FIFO 消息队列 SOCKET Ø  事件通知代表:信号 Ø  分工协作代表:锁和信号灯 Ø  高效数据共享代表:共享内存 进程间通信主要分支及演进

Linux进程间通信 --- IPC机制(转)

在linux下的多个进程间的通信机制叫做IPC(Inter-Process Communication),它是多个进程之间相互沟通的一种方法.在linux下有多种进程间通信的方法:半双工管道.命名管道.消息队列.信号.信号量.共享内存.内存映射文件,套接字等等.使用这些机制可以为linux下的网络服务器开发提供灵活而又坚固的框架. 1. 管道 (PIPE)    管道实际是用于进程间通信的一段共享内存,创建管道的进程称为管道服务器,连接到一个管道的进程为管道客户机.一个进程在向管道写入数据后,另

Linux进程间通信(IPC)编程实践(十二)Posix消息队列--基本API的使用

posix消息队列与system v消息队列的差别: (1)对posix消息队列的读总是返回最高优先级的最早消息,对system v消息队列的读则可以返回任意指定优先级的消息. (2)当往一个空队列放置一个消息时,posix消息队列允许产生一个信号或启动一个线程,system v消息队列则不提供类似机制. 队列中的每个消息具有如下属性: 1.一个无符号整数优先级(posix)或一个长整数类型(system v) 2.消息的数据部分长度(可以为0) 3.数据本身(如果长度大于0) Posix消息队

Linux进程间通信(IPC)编程实践(十一)System V信号量---实现一个先进先出的共享内存shmfifo

使用消息队列即可实现消息的先进先出(FIFO), 但是使用共享内存实现消息的先进先出则更加快速; 我们首先完成C语言版本的shmfifo(基于过程调用), 然后在此基础上实现C++版本的ShmFifo, 将1块共享内存与3个信号量(1个mutext信号量, 1个full信号量, 1个empty信号量)封装成一个类ShmFifo, 然后编写各自的测试代码; shmfifo说明: 将申请到的共享内存作为一块缓冲区, 将该内存的首部(p_shm到p_payload的内容)格式化为如上图所示的形式; 读

Linux进程间通信(IPC)编程实践(二) FIFO命名管道

在前一篇文章中,我们讲解了如何使用匿名管道来在进程之间传递数据,同时也看到了这个方式的一个缺陷,就是这些进程都由一个共同的祖先进程启动,这给我们在不相关的的进程之间交换数据带来了不方便.这里将会介绍进程的另一种通信方式--命名管道,来解决不相关进程间的通信问题. 什么是命名管道 命名管道也被称为FIFO文件,它是一种特殊类型的文件,它在文件系统中以文件名的形式存在,但是它的行为却和之前所讲的没有名字的管道(匿名管道)类似. 由于Linux中所有的事物都可被视为文件,所以对命名管道的使用也就变得与

Linux进程间通信—管道

Linux下的进程通信手段基本上是从UNIX平台上的进程通信手段继承而来的.而对UNIX发展做出重大贡献的两大主力AT&T的贝尔实验室及BSD(加州大学伯克利分校的伯克利软件发布中心)在进程间的通信方面的侧重点有所不同.前者是对UNIX早期的进程间通信手段进行了系统的改进和扩充,形成了"system V IPC",其通信进程主要局限在单个计算机内:后者则跳过了该限制,形成了基于套接口(socket)的进程间通信机制.而Linux则把两者的优势都继承了下来 linux进程间通信(

Linux进程间通信:管道,信号量,消息队列,信号,共享内存,套接字

Linux下的进程通信手段基本上是从UNIX平台上的进程通信手段继承而来的.而对UNIX发展做出重大贡献的两大主力AT&T的贝尔实验室及BSD(加州大学伯克利分校的伯克利软件发布中心)在进程间的通信方面的侧重点有所不同.前者是对UNIX早期的进程间通信手段进行了系统的改进和扩充,形成了“system V IPC”,其通信进程主要局限在单个计算机内:后者则跳过了该限制,形成了基于套接口(socket)的进程间通信机制.而Linux则把两者的优势都继承了下来 linux进程间通信(IPC)有几种方式

深刻理解Linux进程间通信(IPC)

深刻理解Linux进程间通信(IPC) 郑彦兴 原文地址:http://www.ibm.com/developerworks/cn/linux/l-ipc/index.html 一个大型的应用系统,往往需要众多进程协作,进程(Linux进程概念见附1)间通信的重要性显而易见.本系列文章阐述了Linux环境下的几种主要进程间通信手段,并针对每个通信手段关键技术环节给出详细实例.为达到阐明问题的目的,本文还对某些通信手段的内部实现机制进行了分析. 序 linux下的进程通信手段基本上是从Unix平台