Linux 6day
1.进程间通信
进程间通信 进程是孤立的故此需要去访问其他进程 IPC 进程间通讯
进程通信一般用于 数据传输 通知数据 资源共享 进程控制
进程通信的方法
2.无名管道
1.特点
2.管道创建 pipe函数
#include <unistd.h>
int pipe(int pipefd[2]);
功能:创建无名管道。
参数:
pipefd : 为 int 型数组的首地址,其存放了管道的文件描述符 pipefd[0]、pipefd[1]。
当一个管道建立时,它会创建两个文件描述符 fd[0] 和 fd[1]。其中 fd[0] 固定用于读管道,而 fd[1] 固定用于写管道。一般文件 I/O的函数都可以用来操作管道(lseek() 除外)。
返回值:
成功:0
失败:-1
int fds[2];
int ret=-1;
ret=pipe(fds);
3.利用无名管道进行父子间通信
int main()
{
int fds[2];
int ret=-1;
pid_t pid;
ret=pipe(fds);
pid=fork();
if(pid==0)
{
char buf[]=" i am cxy";
write(fds[1],buf,strlen(buf));///管道写
_exit(0);
}
else if(pid>0)
{
wait(NULL);
char str[80]={0};
read(fds[0],str,sizeof(str));//管道读
printf("str=[%s]\n", str);
}
管道阻塞属性 当父进程读管道内无数据就会阻塞 只有写了才会有数据
4.管道读写特点
5.查看缓冲区大小
#include <unistd.h>
long fpathconf(int fd, int name);
功能:该函数可以通过name参数查看不同的属性值
参数:
fd:文件描述符
name:
_PC_PIPE_BUF,查看管道缓冲区大小
_PC_NAME_MAX,文件名字字节数的上限
返回值:
成功:根据name返回的值的意义也不同。
失败: -1
long num = fpathconf(fd[0], _PC_PIPE_BUF);
printf("num = %ld\n", num);
6.设置非阻塞
设置方法:
//获取原来的flags
int flags = fcntl(fd[0], F_GETFL);
// 设置新的flags
flag |= O_NONBLOCK;
// flags = flags | O_NONBLOCK;
fcntl(fd[0], F_SETFL, flags);
标签:6day,int,fds,管道,fd,str,linux,flags From: https://www.cnblogs.com/lzfyz/p/17524433.html