您的位置:首页 > 编程语言 > C语言/C++

一起talk C栗子吧(第八十九回:C语言实例--使用管道进行进程间通信二)

2016-01-03 22:41 363 查看
各位看官们,大家好,上一回中咱们说的是使用管道进行进程间通信的例子,这一回咱们说的例子是:使用管道进行进程间通信,不过使用管道的方式不相同。闲话休提,言归正转。让我们一起talk C栗子吧!

我们在前面章回中介绍了三种管道,这一回我们介绍第二种管道及其使用方法。最主要还是让大家明白如何使用管道进行进程间的通信。

第二种管道我称之为入门级管道。在介绍它之前,我们先介绍一个函数:pipe.

pipe函数的原型

[code]int pipe(int file_descriptor[2])


该函数用来创建管道,并且得到两个文件描述符供我们使用;

该函数只有一个参数,参数为int类型的数组,数组中有两个元素。两个元素都是文件描述符;

管道通过第二个元素指向的文件把数据写入管道,并且通过第一个元素指向的文件从管道中读取数据;

该函数执行成功时返回0,否则返回-1,并且修改errno的值,不同的值代表不同的错误。

pipe函数的使用方法

明白这个函数后,我们接下来介绍入门级管道的使用方法,详细内容如下:

1.使用pipe函数创建管道,并且得到两个文件描述符;

2.在子进程中使用write系统调用通过第二个文件描述符向管道中写入数据;

3.在父进程中使用read系统调用通过第一个文件描述符从管道中读取数据;

我们接下来使用具体的例子进行说明,下面是详细的代码

[code]int main()
{
    char input[] = "IPC by pipe";
    char output[BUFSIZ+1];
    int fd_pipe[2];
    int count = 0;
    int stat_value;
    pid_t pid,pid_res;

    memset(output,'\0',sizeof(output));

    if(pipe(fd_pipe) == 0)     //创建管道
    {
        pid = fork();
        if(pid > 0)
        {
            pid_res = wait(&stat_value);

            if(pid_res > 0)
            {
                count = read(fd_pipe[0],output,BUFSIZ);      //从管道中读取数据
                printf("father process read %d characters,they are: %s \n",count,output);
            }
        }
        else if(pid == 0)
        {
            count = write(fd_pipe[1],input,strlen(input));  //向管道中写入数据
            printf("son process write %d characters,they are : %s \n",count,input);
        }
        else
        {
            printf("create process failed \n");
            return 1;
        }
    }

    return 0;
}


从上面的代码中我们可以看到:

首先是在子进程中使用write向管道中写入数据,写入数据是通过第二个文件描述符来实现的。

接着在父进程中使用read从管道中读取数据,读取数据是通过第一个文件描述符来实现的。

在父进程中我们还使用了wait来同步进程,以确保子进程向管道中写入数据后,父进程再从管道中读取数据。

看官们,正文中就不写代码了,详细的代码放到了我的资源中,大家可以点击这里下载使用。

下面是程序的运行结果,请大家参考

[code]./s                                                        //运行编译后的程序
son process write 11 characters,they are : IPC by pipe     //子进程向管道中写入数据
father process read 11 characters,they are: IPC by pipe    //父进程从管道中读取数据


各位看官,关于使用管道进行进程间通信的例子咱们就说到这里。欲知后面还有什么例子,且听下回分解 。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: