使用pipe与fork函数通过管道实现父子进程之间的通信
作者:Microgoogle 来源: 博客园-shuaiwhu
- 正文
- 点这评论
学习Unix遇到一个题目,要求使用pipe(),fork()函数编写一个程序,能够通过管道实现父子进程之间的通信。
对于fork()函数,调用一次,返回两次:在子进程中返回0;在父进程中返回子进程的进程ID;出错则返回-1。
为什么子进程中只需返回0,而无需返回父进程的进程ID?
子进程中可以调用getppid()函数来获得父进程的进程ID
为什么在父进程中要返回子进程的进程ID?
一个父进程可能有多个子进程,所以在调用fork()函数创建新进程是就需要保存新创建的子进程的进程ID
管道的创建:
int pipe(int filedes[2]) 成功返回0; 出错返回-1。filedes[0]用于读管道,filedes[1]用于写管道。这样,如果进程向filedes[1]写入数据,那么就会从filedes[0]顺序读出来。如果仅有一个进程,创建一个这样的管道交换进程内的数据没什么意义。程序像访问文件一样地访问管道,write()将数据写入管道,read()从管道中读出写入的内容。
理解了这些,我们可以很容易的写出程序:
#include
<
stdio.h
>
#include < unistd.h >
int main()
{
int filedes[ 2 ];
char buf[ 10 ];
pipe(filedes);
if (fork() == 0 )
{
sprintf(buf, " %s " , " ab " );
write(filedes[ 1 ],buf, sizeof (buf));
}
else
{
read(filedes[ 0 ],buf, sizeof (buf));
printf( " %s\n " ,buf);
}
return 0 ;
}
#include < unistd.h >
int main()
{
int filedes[ 2 ];
char buf[ 10 ];
pipe(filedes);
if (fork() == 0 )
{
sprintf(buf, " %s " , " ab " );
write(filedes[ 1 ],buf, sizeof (buf));
}
else
{
read(filedes[ 0 ],buf, sizeof (buf));
printf( " %s\n " ,buf);
}
return 0 ;
}