`
tcspecial
  • 浏览: 896573 次
  • 性别: 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网络编程 视频 教程

    Linux网络编程之进程间通信篇 Linux网络编程之线程篇 Linux网络编程之TCP/IP基础篇 01TCPIP基础(一) ISO/OSI参考模型 TCP/IP四层模型 基本概念(对等通信、封装、分用、端口) 02TCPIP基础(二) 最大传输...

    史上最强的嵌入式底层驱动开发课程 Linux系统开发+Linux高级程序+主板开发+ARM等

    │ ├53 - Linux高级程序_进程间通信_Semaphore1.mp4 │ ├54 - Linux高级程序_进程间通信_Semaphore2.avi │ ├55 - 线程_Thread1.avi │ ├56 - 线程_Thread2.mp4 │ ├57 - 线程_Thread3.mp4 │ ├58 - 网络编程_...

    Linux网络编程c++百度云.txt

    Linux网络编程之TCP/IP基础篇 Linux网络编程之socket编程篇 Linux网络编程之进程间通信篇 Linux网络编程之线程篇 Linux网络编程之TCP/IP基础篇 01TCPIP基础(一) ISO/OSI参考模型 TCP/IP四层模型 基本概念(对等...

    详解Linux进程间通信——使用共享内存

    共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式。这篇文章主要介绍了详解Linux进程间通信——使用共享内存,有兴趣的可以了解一下。

    linux C编程实战

    目 录 第一篇 Linux和C编程基础 ... 第10章 进程间通信  第三篇 Linux网络和图形界面编程  第11章 网络编程   第12章 GTK+图形界面编程  第四篇 Linux项目实践  第13章 项目实践:BT下载软件的开发

    Linux高级编程(无加密版)

    第11章 进程间通信 第12章 PCI 第13章 中断和中断处理 第14章 设备驱动程序 第15章 文件系统 第16章 网络系统 第17章 系统内核机制 第四篇 Linux系统高级编程 第18章 Linux内核模块编程 第19章 有关进程通信的编程 ...

    Linux内核分析及编程高清pdf版(2-1)

    全书分为20章,内容包括进程管理、进程间通信、内存管理、文件系统、I/O接口及资源管理、内核的编译及调试原理、网络通信、内核安全、USB驱动程序等。 对于想了解Linux开发,以及从事Linux内核编程的开发人员来说,...

    C++教程网《Linux网络编程》视频百度云地址

    Linux网络编程之进程间通信篇 Linux网络编程之线程篇 Linux网络编程之TCP/IP基础篇 01TCPIP基础(一) ISO/OSI参考模型 TCP/IP四层模型 基本概念(对等通信、封装、分用、端口) 02TCPIP基础(二) 最大传输...

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

    本篇文章将会简单地讲述如何使用socket进行简单的网络编程。具有很好的参考价值。下面跟着小编一起来看下吧

    c++教程网的linux网络编程视频下载

    Linux网络编程之进程间通信篇 Linux网络编程之线程篇 Linux网络编程之TCP/IP基础篇 01TCPIP基础(一) ISO/OSI参考模型 TCP/IP四层模型 基本概念(对等通信、封装、分用、端口) 02TCPIP基础(二) 最大传输...

    linux网络编程

    21socket编程(十六) UNIX域协议特点 UNIX域地址结构 UNIX域字节流回射客户/服务 UNIX域套接字编程注意点 22socket编程(十七) socketpair sendmsg/recvmsg UNIX域套接字传递描述符字 Linux网络编程之进程间通信篇 ...

    [免费]2018年C++教程网的linux网络编程视频百度云下载链接.rar

    Linux网络编程之进程间通信篇 Linux网络编程之线程篇 Linux网络编程之TCP/IP基础篇 01TCPIP基础(一) ISO/OSI参考模型 TCP/IP四层模型 基本概念(对等通信、封装、分用、端口) 02TCPIP基础(二) 最大传输...

    C++教程网Linux网络编程视频教程

    讲解Linux网络编程基础知识,通过这个课程的学习,实现一个小型的ftp服务器miniftpd。 Linux网络编程之TCP/IP基础篇 Linux网络编程之socket编程篇 Linux网络编程之进程间通信篇 Linux网络编程之线程篇

    Python进程间通信之共享内存详解

    前一篇博客说了怎样通过命名管道实现进程间通信,但是要在windows是使用命名管道,需要使用python调研windows api,太麻烦,于是想到是不是可以通过共享内存的方式来实现。查了一下,Python中可以使用mmap模块来实现...

    LINUX C编程从初学到精通 张繁

    第二部分为提高篇,共有7章,主要讲解了Linux系统下各种操作的系统调用,包括文件操作、进程控制、进程间通信、网络编程、GTK+图形界面编程等。第三部分为实践篇,共有5章,分别为5个不同的Linux平台下C程序开发的...

    C++教程网视频:linux网络编程

    Linux网络编程之进程间通信篇 Linux网络编程之线程篇 Linux网络编程之TCP/IP基础篇 01TCPIP基础(一) ISO/OSI参考模型 TCP/IP四层模型 基本概念(对等通信、封装、分用、端口) 02TCPIP基础(二) 最大传输...

    Linux虚拟机基础知识用法

    信号是进程间通信的一种手段;是一种事件触发机制(类似于中断机制);是一种异步通信(异步通知)(是进程间通信机制中唯一一种异步手段),这种通信无法传递大量的数据;【同步:是一种按照顺序依次执行的过程...

    linux C编程实战 电子书part5

    很好的linux C编程的书,请大家下载五... 第10章 进程间通信  第三篇 Linux网络和图形界面编程  第11章 网络编程   第12章 GTK+图形界面编程  第四篇 Linux项目实践  第13章 项目实践:BT下载软件的开发

    2018年C++教程网的linux网络编程视频共41集百度云下载链接.rar

    Linux网络编程之进程间通信篇 Linux网络编程之线程篇 Linux网络编程之TCP/IP基础篇 01TCPIP基础(一) ISO/OSI参考模型 TCP/IP四层模型 基本概念(对等通信、封装、分用、端口) 02TCPIP基础(二) 最大传输单元...

Global site tag (gtag.js) - Google Analytics