一起talk C栗子吧(第九十回:C语言实例--使用管道进行进程间通信三)
2016-01-04 22:54
453 查看
各位看官们,大家好,上一回中咱们说的是使用管道进行进程间通信的例子,这一回咱们说的例子是:使用管道进行进程间通信,不过使用管道的方式不相同。闲话休提,言归正转。让我们一起talk C栗子吧!
我们在前面章回中介绍了三种管道,这一回我们介绍第三种管道及其使用方法。最主要还是让大家明白如何使用管道进行进程间的通信。
第三种管道我称之为真正意义上的管道,该管道还有另外一个名字:命名管道(FIFO)。在介绍它之前,我们先介绍一个函数:mkfifo.
该函数用来创建一个管道文件;
该函数的第一个参数是字符串,用来表示管道文件的名字;
该函数的第二个参数是文件访问权限,用来表示管道文件的权限,例如:0764;
该函数会返回一个文件描述符,可以通过该文件描述符来操作管道;
该函数执行成功时返回0,否则返回-1。
明白这个函数的用法后,我们接下来介绍命名管道的使用方法.
2.在进程A中使用open打开管道(打开方式为写),这时会得到一个fd;
3.使用write通过fd在管道中写入数据;
4.使用close关闭步骤2中得到的fd;
5.在进程B中使用open打开管道(打开方式为读),这时会得到一个fd;
6.使用read通过fd从管道中读取数据;
7.使用close关闭步骤5中得到的fd;
我们可以看到,进程A在mkfifo创建的管道中写入数据,进程B从该管道中读取数据。进程A和B通过该管道实现了进程之间的通信,通信的内容为数据。
我们接下来使用具体的例子进行说明,下面是详细的代码:
通过上面的代码,大家可以发现,我们首先创建了一个命名管道,然后用fork创建了子进程,并且在子进程中向管道中写入数据,接着在父进程中读取数据,不过父进程使用wait函数等待子进程写入数据后才去管道中读取数据。这便是进程之间互斥的应用。如果不这样做的话,父进程从管道中读取数据时,子进程还没有把数据写入管道。
看官们,正文中就不写代码了,详细的代码放到了我的资源中,大家可以点击这里下载使用。
下面是程序的运行结果,请大家参考:
我们通过上面的程序运行结果可以看到,子进程在管道中写入了数据“IPC by pipe”,父进程接着从管道中读取了该数据,进而实现的了父子进程之间的数据传输,也就是进程之间的通信。
各位看官,关于使用信号进行进程间通信的例子咱们就说到这里。欲知后面还有什么例子,且听下回分解 。
我们在前面章回中介绍了三种管道,这一回我们介绍第三种管道及其使用方法。最主要还是让大家明白如何使用管道进行进程间的通信。
第三种管道我称之为真正意义上的管道,该管道还有另外一个名字:命名管道(FIFO)。在介绍它之前,我们先介绍一个函数:mkfifo.
mkfifo函数的原型
[code]int mkfifo(const char *filename, mode_t mode)
该函数用来创建一个管道文件;
该函数的第一个参数是字符串,用来表示管道文件的名字;
该函数的第二个参数是文件访问权限,用来表示管道文件的权限,例如:0764;
该函数会返回一个文件描述符,可以通过该文件描述符来操作管道;
该函数执行成功时返回0,否则返回-1。
明白这个函数的用法后,我们接下来介绍命名管道的使用方法.
mkfifo函数的用法
1.使用mkfifo函数创建一个命名管道;2.在进程A中使用open打开管道(打开方式为写),这时会得到一个fd;
3.使用write通过fd在管道中写入数据;
4.使用close关闭步骤2中得到的fd;
5.在进程B中使用open打开管道(打开方式为读),这时会得到一个fd;
6.使用read通过fd从管道中读取数据;
7.使用close关闭步骤5中得到的fd;
我们可以看到,进程A在mkfifo创建的管道中写入数据,进程B从该管道中读取数据。进程A和B通过该管道实现了进程之间的通信,通信的内容为数据。
我们接下来使用具体的例子进行说明,下面是详细的代码:
[code]int main() { char input[] = "IPC by pipe"; char output[BUFSIZ+1]; char p_name[] = "/tmp/test_fifo"; int count = 0; int fd; int stat_value; pid_t pid,pid_res; memset(output,'\0',sizeof(output)); if(mkfifo(p_name,0777) == 0) // create pipe { pid = fork(); if(pid > 0) { printf("father running \n"); fd = open(p_name,O_RDONLY); //open by read mode if(fd == -1) { printf("open pipe file failed \n"); return 1; } } else if(pid == 0) { printf("son running \n"); fd = open(p_name,O_WRONLY); //open by write mode if(fd == -1) { printf("open pipe file failed \n"); return 1; } count = write(fd,input,strlen(input)); // write the dato into pipe printf("son process write %d characters,they are : %s \n",count,input); close(fd); } else { printf("create process failed \n"); return 1; } } else { printf("create fifo failed \n"); return 1; } pid_res = wait(&stat_value); if(pid_res > 0) { count = read(fd,output,BUFSIZ); // read the data from pipe printf("father process read %d characters,they are: %s \n",count,output); close(fd); } return 0; }
通过上面的代码,大家可以发现,我们首先创建了一个命名管道,然后用fork创建了子进程,并且在子进程中向管道中写入数据,接着在父进程中读取数据,不过父进程使用wait函数等待子进程写入数据后才去管道中读取数据。这便是进程之间互斥的应用。如果不这样做的话,父进程从管道中读取数据时,子进程还没有把数据写入管道。
看官们,正文中就不写代码了,详细的代码放到了我的资源中,大家可以点击这里下载使用。
下面是程序的运行结果,请大家参考:
[code]./s //运行编译后的程序 father running //父进程在运行 son running //子进程在运行 son process write 11 characters,they are : IPC by pipe //子进程向管道中写入数据 father process read 11 characters,they are: IPC by pipe //父进程从管道中读取数据
我们通过上面的程序运行结果可以看到,子进程在管道中写入了数据“IPC by pipe”,父进程接着从管道中读取了该数据,进而实现的了父子进程之间的数据传输,也就是进程之间的通信。
各位看官,关于使用信号进行进程间通信的例子咱们就说到这里。欲知后面还有什么例子,且听下回分解 。
相关文章推荐
- C++继承方式
- c++回调函数 callback
- C++中字符串的分割
- 理解C语言——从小菜到大神的晋级之路(5)——程序流程控制
- 【VC++6.0】成功制作并使用lib库,转载
- 深入C语言内存区域分配(进程的各个段)详解(转)
- 九九乘法表(C语言实现)- 2016.01.04
- C++开发人脸性别识别教程(5)——通过FaceRecognizer类实现性别识别
- C++ 单链表的基本算法
- C++基础知识总结
- C++模版-重载,嵌套
- C/C++之回调函数
- C语言中,头文件和源文件的关系(转)
- 第4讲C语言程序初体验-练习
- c#与c++交互
- c#与c++类型对应
- c/c++常见的排序算法
- 【C++ OpenGL ES 2.0编程笔记】4: 纹理贴图-图片叠加效果实现
- C++ 释放基类分配的内存(1)
- c++ 编译期与运行期总结