linux进程间通信(一)----初识篇

先给自己打个广告,本人的微信公众号正式上线了,搜索:张笑生的地盘,主要关注嵌入式软件开发,股票基金定投,足球等等,希望大家多多关注,有问题可以直接留言给我,一定尽心尽力回答大家的问题
在这里插入图片描述
一 前言
因为本篇是初识linux进程,也就意味着我们目前还不是很了解linux进程,所以本文主要以一些通俗易懂的比喻和一些个人浅薄的认识谈谈linux进程,后续随着自己知识点的提高,会不定期更新本文。

既然说是初识,那么我们和linux还不是很熟,想想我们在追女朋友之前,还不了解她的话,我们一般会怎么做(想多了吧,程序员有什么女朋友,要什么女朋友,是代码不好玩,还是bug不够多,哈哈,开个玩笑)。我想大家无非都是从一些基础简单的入手,比如通过身边人打听,未来女朋友的作息习惯呀,个人爱好呀,投其所好方能赢得芳心嘛。

ok,如果把linux进程(这里将进程单独列出来了)比作女朋友,我们又该如何去了解并逐步深入呢?

  1. 最起码要知道进程是什么吧(虽然追女友之前,我们已经知道未来女朋友是谁了,但是没追之前,你知道你未来女朋友是谁呢?)?
  2. 进程有什么特点呢(女朋友的作息习惯,或是个人爱好)

二 正篇
1. 进程是什么?
一上来就以一些专业性的回答来回答,相比初识者会比较迷糊,我们先不以专业性的答案来回答。

试想一个场景,我们刚开始学习C语言编程的场景应该还历历在目吧,不管是在window下面编写运行C程序,还是linux环境下面编写运行C程序。我们第一个程序是hello world,当我们在写完第一个hello world并运行之后,实际上在我们的windows/linux环境下面做了什么呢?是不是运行了一个可执行程序,那么这个可执行程序在对应的环境下,我们如何称呼它呢?假设我们写了好几个独立运行的程序,并且同时运行了它们,那么在对应的环境下面,我们又是该如何称呼它呢?

-------------------我是分割线,请思考上面两个场景,再继续阅读----------------

我们把上面单独运行的一个可执行程序称之为一个进程,专业话来回答就是进程是一个具有一定独立功能的程序在一个数据集上的一次动态执行的过程,是操作系统进行资源分配和调度的一个独立单位,是应用程序运行的载体。还是有点不理解这句话对吗?想想我们学习的第一个C程序 hello world,你是怎么命名第一个C程序的?main.c,1st_C.c, 还是别的什么?以linux环境下为例,如果我们的第一个C程序命名为1st.c,按照如下编译运行,那么first就是linux主机下面的一个进程。

gcc 1st.c -o first
./first

2. 进程有什么特点呢?
(a)资源的唯一性,不共享性
不同进程之间的资源(全局变量等等)在用户空间是不能共享的,只能单独属于该进程本身,比如同样以上面的例子为例,我们学习并写了两个程序分别是1st.c和2nd.c,两者之间无任何关系,分别编译并且同时运行
对于1st.c

int global = 1;
int main(int argc, char *argv[])
{
    ......
    return 0;
}
gcc 1st.c -o first

对于2nd.c

int global = 2;
int main(int argc, char *argv[])
{
    ......
    return 0;
}
gcc 2nd.c -o second

显然两个C程序都有global变量,也就是说两个进程first和second都有变量global,那么这两个进程可以访问对方的global吗?显然我们发现是不可能的,否则的话两个进程都无法正确工作了,而我们实际同时运行first和second时,两个线程的工作是正确的。

其实呢,两个单独的进程好比两间房子,这两间房子没有窗户,没有门,互相都看不到对方里面的东西,所以无法实现通信。这里稍微引入一下线程的比喻,而线程呢,好比一间房子里的不同房间,属于这个房子的客厅,厨房等等,是公共区域,所以不同的线程都能够看到并使用

(b)一个进程是如何创建的呢
这个就无法举恰当的例子了,它是调用系统函数fork创建的。但是我想大家都会问我学习的第一个c函数时,并没有调用fork函数来创建,那么windows系统是如何帮我们创建的呢?这个需要单独开一篇文章来讲,这里就不做介绍了。

(c)如果两个进程之间需要访问对方的内容,如何实现?
啊哈,终于问到正点了,这是一个很有价值的问题。概括来说,就需要进程间通信了,就是一个进程要把它的内容传递给对方,另一个进程要能接受对方传递过来的消息。这部分内容是我们学习进程的重点,也是接下来的几篇文章要探讨的内容。

3. 进程间通信原理和示意图
通过上面的知识,我们知道,在用户空间,进程是无法通信的(用户空间是什么鬼,上面没有谈到这个词,你突然来了这一句,我表示有点蒙圈,哈哈)

A和B是两个进程,他们通过操作内核里的同一个对象实现通信 
      |————|                    |————|
      |  A |                    |  B |
      |————|                    |————|
    ----|--------------------------|-----
        |                          |
        |         |------|         |
内核    |-------->| 对象 |<--------|
                  |------|
    -------------------------------------

进程之间通信的原理都是基于文件读写思想,所以因此有open、write、read以及close函数,当然open不是简单的文件open函数,它有属于它自己的类似open的函数。

4. 进程间通信方式有哪些呢
以下通信方式都只有一个linux内核,也就是只在一个设备上(但是这种说法也不完全正确,一个设备上可能存在两个SoC,分别都跑linux系统)

通信方式 分类
信号通信 信号的发送,信号的接收,以及信号的处理
IPC通信 共享内存,消息队列以及信号灯
管道通信 无名管道和有名管道
还有一个多linux之间的通信
socket通信:存在于一个网络中的进程间通信,说白了就是多台设备时间的进程通信

三 后续
上面介绍了一些linux进程的初级知识,希望大家能够明白,没有太多专业的术语,对于linux老手来说,学习到的东西可能不多,请见谅。
接下来的系列文章《linux进程间通信》将分别介绍各种通信方式的基础知识,文中会穿插一些代码,希望大家根据代码在自己本机上实际调试验证,当然这些代码都是在linux虚拟机上调试运行的,希望大家也准备好linux虚拟机。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章