进程之间通过管道通信1,进程管道通信1


  在Linux的shell命令中,可以通过管道操作符'|'来连接进程。在这里,我们通过使用pipe在程序中实现这种效果。

pipe函数原型如下:

      #include<stdio.h>

      int *pipe(int file_descriptor[2]);

  函数说明:

     file_descriptor为由两个整形的文件描述符组成的数组指针。写到file_descriptor[1]的所有数据都可以从file_descriptor[0]读回来。函数执行成功则返回0,否则返回-1。

示例1:子进程读取父进程信息

  创建pipe1.c文件,在这个程序,我们使用pipe来创建一个管道,由父进程给出autorName字符串,然后子进程读出并显示。

 

  我们开始调用pipe来创建一个管道,接着用fork映像出一个新的进程。父进程将autorName字符串写入管道,而子进程从管道中读取出来。

  接下来,我们编译程序:

    $gcc -o pipe1 pipe1.c

  运行,效果如下:

  

  为什么上面的子进程打印出来的消息会在命令提示符后面呢?原因是父进程比子进程先结束!

示例2:不同的进程

  示例1我们是通过fork创建一个与父进程一模一样的进程,在接下来的示例中,我们使用的是两个不同的进程。

  编写pipe3.c文件:

  pipe4.c负责读取数据,如下:

  说明:pipe3.c的作用与pipe1.c的作用差不多,在父进程中,添加了由execl函数启动pipe4进程,execl的参数是:

  • 要启动的程序(包括路径)。
  • arg[0]: 程序名。
  • arg[1]:被启动的进程准备读取的文件描述符。
  • (char *)0:表示终止被调用程序的参数列表。

  pipe4被启动后,将通过read读取由execl传入的参数,编译并运行效果如下:

  注释:以上参考《linux程序设计》(第三版)。


进程的管道通信

进程协同工作时,需要互相交换信息,有些情况下进程间交换的少量信息,有些情况下进程间交换大批数据。进程通信即为两个并行进程可以通过互相发送消息进行合作,消息是通过消息缓冲而在进程之间相互传递的。 如进程同步是一种进程通信,通过修改信号量,进程之间可建立起联系,相互协调运行和协同工作;

进程间通信的方式有:信号通信机制; 共享存储区通信机制;共享文件通信机制;消息传递通信机制.

管道是连接读写进程的一个特殊文件,允许进程按先进先出方式传送数据,也能使进程同步执行操作。发送进程以字符流形式把大量数据送入管道,接收进程从管道中接收数据,所以叫管道通信.

管道的实质是一个共享文件,基本上可借助于文件系统的机制实现,包括(管道)文件的创建、打开、关闭和读写.进程对通信机构的使用应该互斥,一个进程正在使用某个管道写入或读出数据时,另一个进程就必须等待.发送者和接收者双方必须能够知道对方是否存在,如果对方已经不存在,就没有必要再发送信息.管道长度有限,发送信息和接收信息之间要实现正确的同步关系,当写进程把一定数量的数据写入管道,就去睡眠等待,直到读进程取走数据后,把它唤醒。
 

linux下C进程之间管道通信的问题,懂的进来看下这段程序怎运行起来不对

你的要求 “管道尾写个数据后,管道头读,然后在让管道尾写,一直循环”,其实是一个进程同步的问题,即一边写完了,另外一边读,读完了,才能再写。所以要用到进程间通信的方式来让读段通知写端我已经读完了,你可以写下一个了。 有很多种方法来实现这个进程同步,比如用信号量等。不过既然你是一个管道的代码,我就用了管道的方式来实现,让你参考。下面的代码创建了两个管道,pipe_a2b 这个就是你原来的那个管道, pipe_b2a 这个是新加的,用来让读端通知写端可以继续的。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>

int main()
{
char r_buf[10];
char w_buf[10];
pid_t pid;
int pipe_a2b[2]; /* parent write, child read */
int pipe_b2a[2]; /* child write, parent read */
memset(r_buf,0,sizeof(r_buf));

if(pipe(pipe_a2b)<0)
{
printf("creat pipe error\n");
exit(1);
}
if(pipe(pipe_b2a)<0)
{
printf("creat pipe error\n");
exit(1);
}

pid=fork();

if (pid == 0)
{
/* child, reader */
close(pipe_a2b[1]);
close(pipe_b2a[0]);
while(1)
{
read(pipe_a2b[0],r_buf,10);
printf("FIFO :%s\n",r_buf);
write(pipe_b2a[1], "c", 1); /* tells parent continue */
}
close(pipe_a2b[0]);
close(pipe_b2a[1]);
}

if(pid>0)
{
/* parent, writer */
close(pipe_a2b[0]);
close(pipe_b2a[1]);
while(1)
{
printf("please input w_buf:\n");
scanf("%s",w_buf);
write(pipe_a2b[1],w_buf,strlen(w_buf));

/* wait for the "c" from child to continue to next write */
read(pipe_b2a[0], r_buf, 10);
}......余下全文>>
 

相关内容

    暂无相关文章