`
tcspecial
  • 浏览: 916308 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

进程间通信 --linux篇

阅读更多

    linux 下进程间通信就简单多了, 可以采用信号方式.

 

    1. kill 方式

     int kill(pid_t pid,int sig), 当pid=-1 将信号广播传送给系统内所有的进程,在Redhat下测试发现, kill -1 SIGRTMIN+10, 只能广播系统关闭命令,关闭所有的用户进程; 因此此路不通,只能一个一个进程的发送信号.

    2. sigqueue 方式

    遍历所有进程, 然后发送实时信号,达到通知重装配置的目的, 代码如下: 

#include <unistd.h>
#include <dirent.h>
#include <sys/stat.h>
#include <fcntl.h>

/**
 *@brief 根据进程名查找相应PID
 * 在系统 /proc 目录下会找到各个程序运行信息,遍历即可
 *@param pName 进程名称 
 */ 
pid_t GetPidByName(const char *pName)
{
	DIR *pdir = NULL;
	struct dirent *pde = NULL;
	FILE *pf = NULL;

	char buff[128];
	pid_t pid;
	char szName[128];

	pdir = opendir("/proc");
	if (!pdir)
	{
		perror("open /proc fail.\n");
		return -1;
	}

	while ((pde = readdir(pdir)))
	{
		if ((pde->d_name[0] < '0')|| (pde->d_name[0] > '9'))
		{
			continue;
		}

		sprintf(buff, "/proc/%s/status", pde->d_name);
		pf = fopen(buff, "r");
		if (pf)
		{
			fgets(buff,sizeof(buff),pf);
			fclose(pf);

			// 文件第一行格式 Name:  top 
			sscanf(buff,"%*s %s",szName);  // sscanf不错, 获取进程名
			pid=atoi(pde->d_name);

			if(strcmp(szName,pName)==0) 
			{
				closedir(pdir);
				return pid;
			}
		}
	}

	closedir(pdir);
	return 0;
}

// 向进程发送SIGRTMIN+10 的信号 
bool SendMessage(const char *pName)
{
	if(pName==NULL)
	{
		// 无法广播非关闭信号 
		//sigqueue(-1,SIGRTMIN+10,NULL); // 实时消息

		printf("错误:没有指定进程名\n");
		return true;
	}

	pid_t pid=GetPidByName(pName);
	if(pid>0)
	{
		printf("信息:发现进程[%s:%d]\n",pName,pid);

		sigval sVal;
		sigqueue(pid,SIGRTMIN+10,sVal); // 实时信号
		return true;
	}

	printf("错误:没有发现 %s\n",pName);
	return false;
}

 

   接收信号:

/**
 *@brief 安装信号处理函数
 */
bool InstallMessage()
{
	struct sigaction act;

	sigemptyset(&act.sa_mask);
	act.sa_flags=SA_NODEFER; // 非堵塞方式
	act.sa_handler=Messge_Oper;

	// 安装信号 
	if(sigaction(SIGRTMIN+10,&act,NULL)<0)
	{
		printf("错误:安装信号失败\n");
		return false;
	}
	
	return true;
}

// 回调函数
void Message_Oper(int signo)
{
}

 

 

  3. linux下共享内存

   服务端:

/**
 *@brief 向共享内存区写入信息
 *@param szMsg 待写入字符串
 *@return 执行状态 
 */
bool WriteMsgToMemory(const char *szMsg)
{
	if(szMsg==NULL)
	{
		printf("错误:内容为空\n");
		return false;
	}

	if(!IsInitial)
	{
		if(pthread_mutex_init(&mutex,NULL)!=0)
		{
			printf("错误:初始化锁失败\n");
			return false;
		}

		// 创建一个共享内存对象并返回标识 
		if((shmid=shmget(MY_SHM_ID,SHM_SIZE,SHM_W|IPC_CREAT))<0)
		{
			perror("shmget");
			return false;
		}
	}
	
	void *mem;

	// 同步锁
	pthread_mutex_lock(&mutex);

	// 映射内存区对象
	if((mem=shmat(shmid,0,0))==(void*)-1)
		perror("shmat");

	sprintf((char*)mem,"%s",szMsg); // 写入szMsg

	shmdt(mem); // 断开共享内存连接

	pthread_mutex_unlock(&mutex);

	return true;
}

 

    客户端:

// 读取共享内存内容
bool ReadMemoryMsg(char *szMsg)
{
	int shmid;
	void *mem;

	if((shmid=shmget(MY_SHM_ID,SHM_SIZE,SHM_W|IPC_CREAT))<0)
	{
		perror("shmget");
		return false;
	}

	if((mem=shmat(shmid,0,0))==(void*)-1)
	{
		perror("shmat");
		return false;
	}

	// 读取内存
	sprintf(szMsg,"%s",(char*)mem);
	printf("信息:%s\n",szMsg);

	// 卸载映射 
	shmdt(mem) ;

	return true;
}

 

   当配置改变时,将内容写入共享内存,然后向每个进程依次发送通知信号, 进程接收到信号后, 直接读取共享内存

 

 

 

 

分享到:
评论

相关推荐

    Linux 进程间通信

    ### Linux 进程间通信详解 #### 一、管道及有名管道 在深入探讨Linux中的进程间通信(IPC)机制之前,我们先了解一个基本概念:**进程**。进程是程序执行的一个实例,每个进程都有自己的地址空间。当多个进程需要...

    linux进程间通信

    本篇将深入探讨Linux下的进程间通信机制,包括它的原理、常见方法以及应用场景。 1. **进程间通信的基本概念** 进程间通信是指两个或多个独立运行的进程之间进行数据交换的过程。这种通信方式使得进程可以共享资源...

    linux进程间通信——信号机制

    在Linux操作系统中,进程间通信(IPC,Inter-Process Communication)是实现多个进程协同工作的重要手段。其中,信号(Signal)是一种轻量级、异步的通信方式,它允许一个进程向另一个进程发送一个通知,表明某个...

    Linux环境进程间通信技术

    本篇将深入探讨Linux环境下的几种主要进程间通信方式,包括信号(Signal)、管道(Pipe)以及更广泛的IPC技术。 首先,我们来看**信号(Signal)**。信号是一种轻量级的异步通信机制,用于通知接收进程发生了某些...

    Linux进程间通信(一)——Sam用图概述

    本篇文章将聚焦于Linux环境下的进程间通信,并以Sam的图解方式深入浅出地介绍这一主题。通过链接[1]可以查看原文,但在这里,我们将对关键知识点进行详细阐述。 Linux进程间通信是为了实现不同进程之间的数据共享和...

    浅析Linux环境下的进程间通信机制.pdf

    在Linux操作系统中,进程间通信(IPC,Inter-Process Communication)是实现多个并发执行的进程协同工作、共享数据和同步的重要机制。这篇文章主要探讨了在Linux环境下几种主要的IPC机制,包括管道、信号以及消息...

    LINUX进程间通信的模型检测.pdf

    总的来说,这篇论文强调了模型检测在Linux进程间通信中的重要性,提供了具体的实施步骤,并给出了改进通信机制的建议,对于Linux系统开发和维护人员来说,是一份有价值的参考文献,能帮助他们更好地理解和优化Linux...

    Linux下进程间通信机制的探讨.pdf

    《Linux下进程间通信机制的探讨》这篇文章详细阐述了Linux操作系统中进程间通信的各种机制,主要包括信号、管道、信号量、共享内存和消息队列。这些机制是Linux进程协作的基础,使得不同进程能够有效地交换信息。 1...

    qt使用QProcess实现父子进程通信,适用linux平台

    本篇文章将深入探讨如何在Linux环境下,使用Qt的QProcess类实现父子进程间的通信。 首先,QProcess是Qt库中的一个核心组件,它允许我们创建、管理和与外部进程进行交互。在Linux系统中,每个运行的程序都是一个独立...

    linux平台下实现进程间通信的一种:pipe

    在Linux操作系统中,进程间通信(IPC,Inter-Process Communication)是多个进程之间交换数据的重要机制。其中,管道(Pipe)是一种简单而有效的IPC方式,它允许父子进程或者兄弟进程之间进行单向通信。本篇文章将...

    电信设备-一种Linux下的自适应组件间通信方法.zip

    这篇名为“电信设备-一种Linux下的自适应组件间通信方法”的资料深入探讨了如何在Linux操作系统环境下实现这种通信机制。Linux因其开源、稳定和强大的网络支持而广泛应用于各种电信设备。下面我们将详细讲解该主题...

    Linux进程间通信4——使用命名管道.doc

    ### Linux 进程间通信 4 —— 使用命名管道 #### 一、引言 在上一篇文章中,我们探讨了如何利用匿名管道实现进程间的数据传递,并提到了匿名管道的一个限制:即所有通信的进程必须是由同一个祖先进程派生出来的。...

    Linux进程控制编程-父子进程对数据段的访问实例.pdf

    最后,参考文献中提到的《基于项目驱动的嵌入式Linux应用设计开发》一书,通常会涵盖更多关于Linux进程控制的实践案例,包括进程间通信、信号处理、线程同步等,对于深入理解和应用Linux系统编程非常有帮助。...

    进程间通信——匿名管道

    进程间通信(IPC,Inter-Process Communication)是操作系统中一种重要的机制,允许不同的进程之间交换数据,协同工作。在各种IPC方法中,匿名管道是一种简单且古老的通信方式,尤其适用于父子进程之间的通信。本篇...

    linux-api-2.6.22.rar_linux-api-2.6.22_linux-api-2.6.22.chm

    4. **信号处理**:signal()、raise()、sigaction(),用于处理进程间的通信和异常情况。 5. **网络编程**:socket()、bind()、connect()、listen()、accept()等,用于创建套接字、绑定地址、连接服务器、监听连接请求...

    进程间通信:消息队列示例代码

    在Linux系统编程中,进程间通信(IPC, Inter-Process Communication)是多个进程协同工作时不可或缺的一部分。消息队列作为IPC的一种方式,提供了一种可靠的数据传递机制,允许进程之间异步交换信息。本篇文章将深入...

    Linux进程控制编程-获取进程ID实例.pdf

    在上述程序中,`getppid()`用于打印出父进程的ID,这有助于了解进程间的层次关系。 在Linux系统中,进程ID是操作系统分配的,它是进程身份的唯一标识。而父进程ID则可以用来追踪进程的生成链,这对于调试、监控和...

    linux--进程

    进程间通信(IPC,Inter-Process Communication)是进程间交换信息的方式,包括管道、信号量、消息队列、共享内存、套接字等机制。 七、进程调度 Linux采用多种调度算法,如轮转调度(Round Robin)、优先级调度...

    嵌入式Linux下C语言编程应用程序开发详解【完整篇】 7

    ### 嵌入式Linux下的C语言编程:进程间通信详解 #### 一、引言 随着嵌入式系统的不断发展,Linux系统因其高度的可定制性、强大的稳定性以及丰富的开源资源,成为了许多嵌入式应用的首选操作系统。在嵌入式Linux...

    Linux进程间通信——使用流套接字

    【Linux进程间通信——使用流套接字】这篇文章主要介绍了如何利用socket进行进程间通信,尤其是跨网络的通信。Socket,又称套接字,是一种通信机制,它允许不同计算机或同一计算机上的进程通过网络进行通信。以下是...

Global site tag (gtag.js) - Google Analytics