管道
无名管道
特点:
- 有固定读写端
- 没有写入数据,read会阻塞
- 只能用于父子进程通信
创建
int pipe(int pipefd[2]);
返回:成功 0 失败 -1
参数:fildes[0] 读端的文件描述符
fildes[1] 写段的文件描述符
使用
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
char buf[50];
int fd[2];
pipe(fd);
pid_t id = fork();
if ( id > 0 )//父进程
{
while(1)
{
bzero(buf, 50);
read(fd[0], buf, 50);
printf("子进程发送了:%s\n", buf);
if ( buf[0] == 'q' && strlen(buf) == 1 )//q退出
{
break;
}
}
}
else if ( id == 0 )//子进程
{
while(1)
{
bzero(buf, 50);
printf("发送给父进程的信息:");
scanf("%s",buf);
write(fd[1], buf, strlen(buf));
}
}
close(fd[0]);//释放资源
close(fd[1]);
}
有名管道
特点:
- 不区分读写端
- 没有数据写入,read读取阻塞
- 可以用于毫无关系的进程通信
- 只能用于linux
创建
#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *pathname, mode_t mode);
返回:成功 0 失败 -1
参数:pathname --》 创建有名管道文件的路径名(无名管道没有对应文件)
mode --》 权限
使用
#include <sys/types.h>
#include <stdio.h>
#include <sys/stat.h>
#include <errno.h>
int main()
{
mkfifo("/home/myfifo", 0777);
if ( errno == EEXIST )//判断mkfifo是否报错文件存在,使用man查看mkfifo
{
printf("exits!!!!\n");
}
}
open(); read(); write(); close();操作文件/home/myfifo
还可以使用 <unistd.h>里面的int access(const char *pathname, int mode);
判断文件状态
返回:成功 0 失败 -1
参数:pathname --》 文件路径
mode --》 R_OK 可读
W_OK 可写
X_OK 可读写
F_OK 存在性