各位看官们,大家好,上一回中咱们说的是使用管道进行进程间通信的例子,这一回咱们说的例子是:使用管道进行进程间通信,不过使用管道的方式不相同。闲话休提,言归正转。让我们一起talk C栗子吧!
我们在前面章回中介绍了三种管道,这一回我们介绍第二种管道及其使用方法。最主要还是让大家明白如何使用管道进行进程间的通信。
第二种管道我称之为入门级管道。在介绍它之前,我们先介绍一个函数:pipe.
pipe函数的原型
int pipe(int file_descriptor[2])
- 该函数用来创建管道,并且得到两个文件描述符供我们使用;
- 该函数只有一个参数,参数为int类型的数组,数组中有两个元素。两个元素都是文件描述符;
- 管道通过第二个元素指向的文件把数据写入管道,并且通过第一个元素指向的文件从管道中读取数据;
- 该函数执行成功时返回0,否则返回-1,并且修改errno的值,不同的值代表不同的错误。
pipe函数的使用方法
明白这个函数后,我们接下来介绍入门级管道的使用方法,详细内容如下:
- 1.使用pipe函数创建管道,并且得到两个文件描述符;
- 2.在子进程中使用write系统调用通过第二个文件描述符向管道中写入数据;
- 3.在父进程中使用read系统调用通过第一个文件描述符从管道中读取数据;
我们接下来使用具体的例子进行说明,下面是详细的代码:
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来同步进程,以确保子进程向管道中写入数据后,父进程再从管道中读取数据。
看官们,正文中就不写代码了,详细的代码放到了我的资源中,大家可以点击这里下载使用。
下面是程序的运行结果,请大家参考:
./s //运行编译后的程序
son process write 11 characters,they are : IPC by pipe //子进程向管道中写入数据
father process read 11 characters,they are: IPC by pipe //父进程从管道中读取数据
各位看官,关于使用管道进行进程间通信的例子咱们就说到这里。欲知后面还有什么例子,且听下回分解 。