#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/wait.h>
#include <sys/types.h>
/*
匿名管道:
1.匿名管道是半双工管道,一端用于写,另一端用于读,写端关闭读管道,读端关闭写管道;
2.只能用于父子进程或兄弟进程间通信,父进程向管道写数据,子进程从管道读取数据,当然也可以反过来
*/
int main()
{
int pipe_fd[2];
int res = 0;
char r_buff[1024];
char w_buff[1024];
int iread_len = 0;
int iwrite_len = 0;
int status;
memset(r_buff, 0x00, sizeof(r_buff));
memset(w_buff, 0x00, sizeof(w_buff));
//初始化管道读写文件描述符,pipe_fd[0]--输入(读取), pipe_fd[1]--输出(写入)
res = pipe(pipe_fd);
if (res < 0)
{
printf("pipe exec failed, errno=%d, errmsg=%s, res=%d\n", errno, strerror(errno), res);
return -1;
}
res = fork();
if (res < 0)
{
printf("fork exec failed, errno=%d, errmsg=%s, res=%d\n", errno, strerror(errno), res);
exit(1);
}
else if (res == 0)
{
/* 子进程先关闭写端并从管道一端读取数据 */
close(pipe_fd[1]);
iread_len = read(pipe_fd[0], r_buff, sizeof(r_buff)-1);
printf("child process read buff=%s, len=%d\n",r_buff, iread_len );
close(pipe_fd[0]);
exit(2);
}
else
{
/* 父进程先关闭读端并向管道一端写数据 */
close(pipe_fd[0]);
strcpy(w_buff, "hello ipc!");
iwrite_len = write(pipe_fd[1], w_buff, strlen(w_buff));
printf("parent process write buff=%s, len=%d\n",w_buff, iwrite_len );
close(pipe_fd[1]);
/* 防止子进程先与父进程退出 */
wait(&status);
printf("child process return code=%d\n", status>>8);
}
return 0;
}
linux C匿名管道
最新推荐文章于 2024-04-19 18:06:57 发布