linux 进程间通信的几种方式

linux 进程间通信的几种方式,第1张

第一种:管道通信

两个进程利用管道进行通信时,发送信息的进程称为写进程;接收信息的进程称为读进程。管道通信方式的中间介质就是文件,通常称这种文件为管道文件,它就像管道一样将一个写进程和一个读进程连接在一起,实现两个进程之间的通信。写进程通过写入端往管道文件中写入信息;读进程通过读出端从管道文件中读取信息。两个进程协调不断地进行写和读,便会构成双方通过管道传递信息的流水线。

第二种:消息缓冲通信

多个独立的进程之间可以通过消息缓冲机制来相互通信。这种通信的实现是以消息缓冲区为中间介质,通信双方的发送和接收 *** 作均以消息为单位。在存储器中,消息缓冲区被组织成队列,通常称之为消息队列。消息队列一旦创建后即可由多进程共享,发送消息的进程可以在任意时刻发送任意个消息到指定的消息队列上,并检查是否有接收进程在等待它所发送的消息。若有则唤醒它,而接收消息的进程可以在需要消息的时候到指定的消息队列上获取消息,如果消息还没有到来,则转入睡眠等待状态。

第三种:共享内存通信

针对消息缓冲需要占用CPU进行消息复制的缺点,OS提供了一种进程间直接进行数据交换的通信方式。共享内存,顾名思义这种通信方式允许多个进程在外部通信协议或同步,互斥机制的支持下使用同一个内存段进行通信,它是一种最有效的数据通信方式,其特点是没有中间环节,直接将共享的内存页面通过附接映射到相互通信的进程各自的虚拟地址空间中,从而使多个进程可以直接访问同一个物理内存页面。

C# 把你需要的功能,都封装好了,在 SystemDiagnostics 这个Namespace 下面获取进程的句柄数: SystemDiagnosticsProcess p = SystemDiagnosticsProcessGetProcessById(进程的PID); pHandleCount 就是进程打开的句柄数了 其他的功能,在 Process 类里面都有,请自行测试

*** 作系统中负责线程间通讯的东西叫管道。

管道(pipe)是进程用来通讯的共享内存区域。一个进程往管道中写入信息,而其它的进程可以从管道中读出信息。如其名,管道是进程间数据交流的通道。

管道技术一般采用Window API来实现,但C#本身方便的进程线程机制使工作变得简单

首先,我们可以通过设置Process类,获取输出接口,代码如下:

Process proc = new Process();

proc StartInfoFileName = strScript;

proc StartInfoWorkingDirectory = strDirectory;

proc StartInfoCreateNoWindow = true;

proc StartInfoUseShellExecute = false;

proc StartInfoRedirectStandardOutput = true;

proc Start();

然后设置线程连续读取输出的字符串:

eventOutput = new AutoResetEvent(false);

AutoResetEvent[] events = new AutoResetEvent[1];

events[0] = m_eventOutput;

m_threadOutput = new Thread( new ThreadStart( DisplayOutput ) );

m_threadOutputStart();

WaitHandleWaitAll( events );

线程函数如下:

private void DisplayOutput()

{

while ( m_procScript != null && !m_procScriptHasExited )

{

string strLine = null;

while ( ( strLine = m_procScriptStandardOutputReadLine() ) != null)

{

m_txtOutputAppendText( strLine + "\r\n" );

m_txtOutputSelectionStart = m_txtOutputTextLength;

m_txtOutputScrollToCaret();

}

ThreadSleep( 100 );

}

m_eventOutputSet();

}

m_txtOutputAppendText( strLine + "\r\n" );

m_txtOutputSelectionStart = m_txtOutputTextLength;

m_txtOutputScrollToCaret();

为了不阻塞主线程,可以将整个过程放到一个另一个线程里就可以了

        foreach (Process p in ProcessGetProcesses())

        {

            try

            {

                

                if (pMainWindowHandle == IntPtrZero) continue;

                ConsoleWriteLine(pProcessName+":");

                ConsoleWriteLine(pMainModuleFileName);

            }

            catch(SystemException exp)

            {

                ConsoleWriteLine(expMessage);

            }

    

        }

以Linux下的为例吧,管道是一种进程间通信的方式,在linux中分为有名管道和无名管道。有名管道就是把一个进程的输出写到一个文件中,再把此文件作为另一个进程的输入。

无名管道也是如此,只不过这个管道文件不直接可见而已,通常无名管道都作为一个进程组的形式完成,如ls | grep 'a',这就是一种进程间单向的通信方式。

更详细的建议看一下《Understanding Linux Kernel》第三版中进程通信的那章。

管道是进程间数据交流的通道 类似共享文件

进程是程序的一次执行

线程是 进程执行单位

入口函数是 程序执行的第一个指令开始的地方

一个程序执行后回产生一个进程

汗汗

这个是 *** 作系统内核方面的知识 你认为很简单吗

先说管道 管道就是内存的一块区域 各个进程通信用来存放数据的缓冲区

*** 作系统加载启动时 第一个进程是 手工创建的也就是所有的进程的祖先 *** 作系统内核方面书有介绍

程序是指令的集合 进程是程序的动态 就是加载到内存执行 就构成了进程

第一个进程创建了所有的进程 首先是创建系统进程 然后是终端进程 终端进程

创建用户登陆 用户登陆后加载所有个人信息 然后等待命令 这就类似DOS系统

要是图形截面原理也差不多 就是终端换成 窗口系统 等待鼠标 命令

进程当然可以创建进程 线程也可以创建线程 线程也可以创建进程 通过系统调用可以实现也就是API 想知道具体那个API函数 去学学API编程

实际上还要说到运行库

应用程序启动后先执行的函数是运行库函数 然后运行库函数去调用MAIN函数

这样MAIN函数就是主线程

现在支持线程的 *** 作系统 进程只是资源的拥有者 线程才是执行者

所有内容都是本人写的 绝没有复制他人的 和转载他人的

以上就是关于linux 进程间通信的几种方式全部的内容,包括:linux 进程间通信的几种方式、C#怎么获取所有进程的信息、请问什么是数据管道,在c#中是怎么具体应用的等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9530558.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存