Linux教程

Linux下进程间通信

本文主要是介绍Linux下进程间通信,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

以下内容仅作为个人记录的参考,但也欢迎读者前来指正。

现在linux下使用较多的进程间通信方式主要有以下几种:
1.管道及有名管道(named pipe)。管道用于有亲缘关系进程间通信,有名管道没有亲缘关系限制。
2.信号(signal):信号是在软件层面对终端机制的一种模拟
3.消息队列(messagae queue):克服前面的信息量有限的缺点,具有权限限制的功能
4.共享内存(shared memory):多个进程可以同时访问同一块内存空间,依靠某种同步机制,如互斥锁和信号量。
5.信号量(semaphore):主要作为进程之间以及同一进程的不同线程之间的同步和互斥手段
6.套接字(socket)

1.管道:

创建管道时,它会创建两个文件描述符fds[0]/fds[1],分别固定为读/写。

#include<unistd.h>

int pipe(int fd[2]);

成功:返回0
失败:返回-1
 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<unistd.h>
 4 
 5 int main()
 6 {
 7         int pipefd[2];
 8         char buff[] = "hello";
 9         int len = strlen(buff);
10         char* data;
11         data = (char*)malloc(len+1);
12         if(pipe(pipefd)<0)
13         {
14                 printf("create pipe error.\n");
15                 exit(1);
16         }
17         int pid;
18         pid = fork();
19         if(pid==0)
20         {
21                 close(pipefd[1]);
22                 sleep(3);
23                 int readLen = read(pipefd[0],data,(len+1));
24                 if(readLen>0)
25                 {
26                         printf("child recv %d bytes,and data is %s\n",readLen,data);
27                         exit(0);
28                 }
29 
30         }
31         else if(pid>0)
32         {
33                 close(pipefd[0]);
34                 sleep(1);
35                 int writeLen = write(pipefd[1],buff,len);
36                 printf("writeLen = %d\n",writeLen);
37                 if(writeLen>0)
38                 {
39                         printf("parent write %d bytes,and data is %s.\n",writeLen,buff);
40                         waitpid(pid,NULL,0);
41                         exit(0);
42                 }
43         }
44         return 0;
45 }

 

 

标准流管道:

使用popen(const char* command,const char* type);
类似于shell执行command一样。
type可以是"r",该命令产生输出
"w",该命令产生输入

成功:返回文件流指针
失败:返回-1
pclose(fp);关闭上面产生的文件流

 

这篇关于Linux下进程间通信的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!