linux 6day

发布时间 2023-07-03 23:18:42作者: snowa

Linux 6day

1.进程间通信

进程间通信 进程是孤立的故此需要去访问其他进程 IPC 进程间通讯

进程通信一般用于 数据传输 通知数据 资源共享 进程控制

进程通信的方法

zc

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);