当前位置: 首页 > wzjs >正文

网站建设人员管理制度aso优化

网站建设人员管理制度,aso优化,网站建设课设总结报告,四川电脑网站建设【管道】 目录:进程间通信(IPC)概览匿名管道(PIPE)基本逻辑函数接口管道的读写特性管道的阻塞特性注意事项代码示例运行示例 相关知识点管道的父进程 子进程管道的创建父进程和子进程的使用模式单向通信双向通信 资源管…

【管道】

  • 目录:
      • 进程间通信(IPC)概览
      • 匿名管道(PIPE)
        • 基本逻辑
        • 函数接口
        • 管道的读写特性
        • 管道的阻塞特性
        • 注意事项
        • 代码示例
        • 运行示例
      • 相关知识点
      • 管道的父进程 子进程
      • 管道的创建
      • 父进程和子进程的使用模式
        • 单向通信
        • 双向通信
      • 资源管理

目录:

在这里插入图片描述

进程间通信(IPC)概览

进程间通信(Inter - Process Communication,IPC)是指在不同进程之间传播或交换信息的机制。在 Linux 系统中,常见的 IPC 方式有匿名管道(PIPE)、命名管道(FIFO)、消息队列、共享内存、信号量等。不同的 IPC 方式适用于不同的场景,例如,匿名管道适用于具有亲缘关系的进程间通信,而命名管道可以用于无亲缘关系的进程间通信

匿名管道(PIPE)

基本逻辑

匿名管道是一种半双工的通信方式,数据只能在一个方向上流动,即一端用于写入数据,另一端用于读取数据。匿名管道只能用于具有亲缘关系的进程(如父子进程)之间的通信。在创建管道时,系统会为管道分配两个文件描述符,一个用于读操作(fd[0]),另一个用于写操作(fd[1])。

函数接口

在 Linux 中,使用 pipe 函数来创建匿名管道,其原型如下:

#include <unistd.h>
int pipe(int fd[2]);
  • 参数fd 是一个包含两个整数的数组,fd[0] 用于读取管道中的数据,fd[1] 用于向管道中写入数据。
  • 返回值:成功时返回 0,失败时返回 -1,并设置相应的错误码。
管道的读写特性
  • 写入操作:向管道中写入数据时,数据会被追加到管道的末尾。如果管道已满,写入操作会被阻塞,直到管道中有足够的空间。
  • 读取操作:从管道中读取数据时,数据会从管道的头部开始被读取。如果管道为空,读取操作会被阻塞,直到有数据被写入管道。
    在这里插入图片描述
管道的阻塞特性
  • 写入阻塞当管道已满(默认情况下管道的缓冲区大小为 65536 字节),写入进程会被阻塞,直到有其他进程从管道中读取数据,释放出足够的空间
  • 读取阻塞:当管道为空时,读取进程会被阻塞,直到有其他进程向管道中写入数据。如果所有的写端文件描述符都已关闭,读取操作将不会阻塞,而是返回 0,表示已经读取到文件末尾。
注意事项
  • 半双工通信:匿名管道是半双工的,数据只能在一个方向上流动。如果需要双向通信,需要创建两个管道。
  • 亲缘关系匿名管道只能用于具有亲缘关系的进程之间的通信,通常是父子进程
  • 文件描述符关闭:在使用完管道后,需要及时关闭不再使用的文件描述符,避免资源泄漏。
代码示例
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>#define BUFFER_SIZE 1024int main() {int fd[2];pid_t pid;char buffer[BUFFER_SIZE];// 创建管道if (pipe(fd) == -1) {perror("pipe");return 1;}// 创建子进程pid = fork();if (pid == -1) {perror("fork");return 1;}if (pid == 0) {// 子进程close(fd[0]); // 关闭读端const char *message = "Hello, parent process!";// 向管道中写入数据if (write(fd[1], message, strlen(message)) == -1) {perror("write");return 1;}close(fd[1]); // 关闭写端exit(0);} else {// 父进程close(fd[1]); // 关闭写端// 从管道中读取数据ssize_t bytes_read = read(fd[0], buffer, BUFFER_SIZE);if (bytes_read == -1) {perror("read");return 1;}buffer[bytes_read] = '\0';printf("父进程收到消息: %s\n", buffer);close(fd[0]); // 关闭读端}return 0;
}
运行示例
shaseng@ubuntu:~$ gcc -o pipe_example pipe_example.c
shaseng@ubuntu:~$ ./pipe_example
父进程收到消息: Hello, parent process!

相关知识点

  • 文件描述符:在 Linux 系统中,文件描述符是一个非负整数,用于标识打开的文件、管道、套接字等。pipe 函数返回的两个文件描述符分别用于管道的读和写操作。
  • fork 函数fork 函数用于创建一个新的进程,新进程是原进程的子进程。在使用匿名管道进行通信时,通常先创建管道,然后使用 fork
    函数创建子进程,父子进程通过管道进行通信。
  • 读写操作write 函数用于向文件描述符中写入数据,read 函数用于从文件描述符中读取数据。在管道通信中,通过 write 函数向管道的写端写入数据,通过 read 函数从管道的读端读取数据。

管道的父进程 子进程

在使用匿名管道进行进程间通信时,父进程和子进程扮演着不同的角色,下面从创建、使用和资源管理等方面详细介绍管道中父进程和子进程的相关内容。

管道的创建

在使用匿名管道进行进程间通信时,通常是由父进程先创建管道,再创建子进程。这是因为匿名管道只能在具有亲缘关系的进程(如父子进程)间使用,且管道的文件描述符是通过 pipe 函数创建的。

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>int main() {int fd[2];if (pipe(fd) == -1) {perror("pipe");return 1;}// 后续可创建子进程return 0;
}

在上述代码中,父进程调用 pipe 函数创建了一个管道,fd[0] 用于读,fd[1] 用于写。

在这里插入图片描述

父进程和子进程的使用模式

单向通信
  • 父进程写,子进程读
    父进程关闭读端(fd[0]),向写端(fd[1])写入数据;子进程关闭写端(fd[1]),从读端(fd[0])读取数据。
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>#define BUFFER_SIZE 1024int main() {int fd[2];pid_t pid;char buffer[BUFFER_SIZE];if (pipe(fd) == -1) {perror("pipe");return 1;}pid = fork();if (pid == -1) {perror("fork");return 1;}if (pid == 0) {// 子进程close(fd[1]);  // 关闭写端ssize_t bytes_read = read(fd[0], buffer, BUFFER_SIZE);if (bytes_read == -1) {perror("read");return 1;}buffer[bytes_read] = '\0';printf("子进程收到消息: %s\n", buffer);close(fd[0]);} else {// 父进程close(fd[0]);  // 关闭读端const char *message = "Hello, child process!";if (write(fd[1], message, strlen(message)) == -1) {perror("write");return 1;}close(fd[1]);}return 0;
}
  • 子进程写,父进程读
    子进程关闭读端(fd[0]),向写端(fd[1])写入数据;父进程关闭写端(fd[1]),从读端(fd[0])读取数据。
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>#define BUFFER_SIZE 1024int main() {int fd[2];pid_t pid;char buffer[BUFFER_SIZE];if (pipe(fd) == -1) {perror("pipe");return 1;}pid = fork();if (pid == -1) {perror("fork");return 1;}if (pid == 0) {// 子进程close(fd[0]);  // 关闭读端const char *message = "Hello, parent process!";if (write(fd[1], message, strlen(message)) == -1) {perror("write");return 1;}close(fd[1]);} else {// 父进程close(fd[1]);  // 关闭写端ssize_t bytes_read = read(fd[0], buffer, BUFFER_SIZE);if (bytes_read == -1) {perror("read");return 1;}buffer[bytes_read] = '\0';printf("父进程收到消息: %s\n", buffer);close(fd[0]);}return 0;
}
双向通信

若要实现父子进程的双向通信,需要创建两个管道,一个用于父进程向子进程发送数据,另一个用于子进程向父进程发送数据。

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>#define BUFFER_SIZE 1024int main() {int fd1[2], fd2[2];pid_t pid;char buffer[BUFFER_SIZE];if (pipe(fd1) == -1 || pipe(fd2) == -1) {perror("pipe");return 1;}pid = fork();if (pid == -1) {perror("fork");return 1;}if (pid == 0) {// 子进程close(fd1[1]);  // 关闭父->子管道的写端close(fd2[0]);  // 关闭子->父管道的读端// 从父进程读取数据ssize_t bytes_read = read(fd1[0], buffer, BUFFER_SIZE);if (bytes_read == -1) {perror("read");return 1;}buffer[bytes_read] = '\0';printf("子进程收到父进程消息: %s\n", buffer);// 向父进程发送数据const char *message = "Hello back, parent!";if (write(fd2[1], message, strlen(message)) == -1) {perror("write");return 1;}close(fd1[0]);close(fd2[1]);} else {// 父进程close(fd1[0]);  // 关闭父->子管道的读端close(fd2[1]);  // 关闭子->父管道的写端// 向子进程发送数据const char *message = "Hello, child!";if (write(fd1[1], message, strlen(message)) == -1) {perror("write");return 1;}// 从子进程读取数据ssize_t bytes_read = read(fd2[0], buffer, BUFFER_SIZE);if (bytes_read == -1) {perror("read");return 1;}buffer[bytes_read] = '\0';printf("父进程收到子进程消息: %s\n", buffer);close(fd1[1]);close(fd2[0]);}return 0;
}

资源管理

在使用完管道后,父子进程都需要及时关闭不再使用的文件描述符,以避免资源泄漏。例如,在上述代码中,子进程和父进程在完成读写操作后,都会调用 close 函数关闭相应的文件描述符

此外,父进程还需要负责回收子进程的资源,避免产生僵尸进程。可以通过调用 waitwaitpid 函数来实现。

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>int main() {int fd[2];pid_t pid;if (pipe(fd) == -1) {perror("pipe");return 1;}pid = fork();if (pid == -1) {perror("fork");return 1;}if (pid == 0) {// 子进程操作// ...exit(0);} else {// 父进程操作// ...int status;wait(&status);}return 0;
}

综上所述,在管道通信中,父进程和子进程需要根据通信需求合理使用管道的读写端,并做好资源管理工作。

http://www.dtcms.com/wzjs/115959.html

相关文章:

  • 中国工商做年报网站女教师网课入侵录屏冫
  • 文章类网站源码武汉百度关键词推广
  • 网站付费怎么做网络营销业务流程
  • 网站说明页内容维护电商推广和网络推广的区别
  • 武汉网站seo优化推广seo手机关键词网址
  • 东莞网站建设中企动力技术支持百度指数平台
  • 杭州学校网站开发广告营销推广
  • 爱网站关键词查询广告营销策略
  • 德阳网站建设 选哪家好中国免费网站服务器2020
  • 多少钱可以做网站网络营销主要干什么
  • 网站建设与维护就业前景app安装下载
  • 建设网站 费用济南seo官网优化
  • 广州网站建设企业杭州网站设计制作
  • 独立外贸网站推广免费网络推广100种方法
  • 织梦做的网站要怎么放到浏览器智慧软文
  • 公司建设网站方案搜什么关键词能搜到好片
  • 优质的专业网站建设精准客源推广引流
  • 网站悬浮图标怎么做哪里有免费的网站推广服务
  • 网站建设信息稿手机做网页的软件
  • 秒收录网站广州广告推广公司
  • 怎样用php做网站怎么接广告赚钱
  • 国家免费技能培训优化公司治理结构
  • 网站建设开发服务费怎么做账怎么设计一个网页
  • 科技加盟网站建设引流软件下载站
  • 网站 wordpress 公众号关键字挖掘爱站网
  • 政府部门网站建设意义东莞网站定制开发
  • 在线图片编辑制作网站优化策划书
  • 百度文库web网站开发怎么推广一个产品
  • 西安手机网站建设动力无限如何快速推广网站
  • 安阳网站制作优化seo技术论坛