爆款云主机2核4G限时秒杀,88元/年起!
查看详情

活动

天翼云最新优惠活动,涵盖免费试用,产品折扣等,助您降本增效!
热门活动
  • 618智算钜惠季 爆款云主机2核4G限时秒杀,88元/年起!
  • 免费体验DeepSeek,上天翼云息壤 NEW 新老用户均可免费体验2500万Tokens,限时两周
  • 云上钜惠 HOT 爆款云主机全场特惠,更有万元锦鲤券等你来领!
  • 算力套餐 HOT 让算力触手可及
  • 天翼云脑AOne NEW 连接、保护、办公,All-in-One!
  • 中小企业应用上云专场 产品组合下单即享折上9折起,助力企业快速上云
  • 息壤高校钜惠活动 NEW 天翼云息壤杯高校AI大赛,数款产品享受线上订购超值特惠
  • 天翼云电脑专场 HOT 移动办公新选择,爆款4核8G畅享1年3.5折起,快来抢购!
  • 天翼云奖励推广计划 加入成为云推官,推荐新用户注册下单得现金奖励
免费活动
  • 免费试用中心 HOT 多款云产品免费试用,快来开启云上之旅
  • 天翼云用户体验官 NEW 您的洞察,重塑科技边界

智算服务

打造统一的产品能力,实现算网调度、训练推理、技术架构、资源管理一体化智算服务
智算云(DeepSeek专区)
科研助手
  • 算力商城
  • 应用商城
  • 开发机
  • 并行计算
算力互联调度平台
  • 应用市场
  • 算力市场
  • 算力调度推荐
一站式智算服务平台
  • 模型广场
  • 体验中心
  • 服务接入
智算一体机
  • 智算一体机
大模型
  • DeepSeek-R1-昇腾版(671B)
  • DeepSeek-R1-英伟达版(671B)
  • DeepSeek-V3-昇腾版(671B)
  • DeepSeek-R1-Distill-Llama-70B
  • DeepSeek-R1-Distill-Qwen-32B
  • Qwen2-72B-Instruct
  • StableDiffusion-V2.1
  • TeleChat-12B

应用商城

天翼云精选行业优秀合作伙伴及千余款商品,提供一站式云上应用服务
进入甄选商城进入云市场创新解决方案
办公协同
  • WPS云文档
  • 安全邮箱
  • EMM手机管家
  • 智能商业平台
财务管理
  • 工资条
  • 税务风控云
企业应用
  • 翼信息化运维服务
  • 翼视频云归档解决方案
工业能源
  • 智慧工厂_生产流程管理解决方案
  • 智慧工地
建站工具
  • SSL证书
  • 新域名服务
网络工具
  • 翼云加速
灾备迁移
  • 云管家2.0
  • 翼备份
资源管理
  • 全栈混合云敏捷版(软件)
  • 全栈混合云敏捷版(一体机)
行业应用
  • 翼电子教室
  • 翼智慧显示一体化解决方案

合作伙伴

天翼云携手合作伙伴,共创云上生态,合作共赢
天翼云生态合作中心
  • 天翼云生态合作中心
天翼云渠道合作伙伴
  • 天翼云代理渠道合作伙伴
天翼云服务合作伙伴
  • 天翼云集成商交付能力认证
天翼云应用合作伙伴
  • 天翼云云市场合作伙伴
  • 天翼云甄选商城合作伙伴
天翼云技术合作伙伴
  • 天翼云OpenAPI中心
  • 天翼云EasyCoding平台
天翼云培训认证
  • 天翼云学堂
  • 天翼云市场商学院
天翼云合作计划
  • 云汇计划
天翼云东升计划
  • 适配中心
  • 东升计划
  • 适配互认证

开发者

开发者相关功能入口汇聚
技术社区
  • 专栏文章
  • 互动问答
  • 技术视频
资源与工具
  • OpenAPI中心
开放能力
  • EasyCoding敏捷开发平台
培训与认证
  • 天翼云学堂
  • 天翼云认证
魔乐社区
  • 魔乐社区

支持与服务

为您提供全方位支持与服务,全流程技术保障,助您轻松上云,安全无忧
文档与工具
  • 文档中心
  • 新手上云
  • 自助服务
  • OpenAPI中心
定价
  • 价格计算器
  • 定价策略
基础服务
  • 售前咨询
  • 在线支持
  • 在线支持
  • 工单服务
  • 建议与反馈
  • 用户体验官
  • 服务保障
  • 客户公告
  • 会员中心
增值服务
  • 红心服务
  • 首保服务
  • 客户支持计划
  • 专家技术服务
  • 备案管家

了解天翼云

天翼云秉承央企使命,致力于成为数字经济主力军,投身科技强国伟大事业,为用户提供安全、普惠云服务
品牌介绍
  • 关于天翼云
  • 智算云
  • 天翼云4.0
  • 新闻资讯
  • 天翼云APP
基础设施
  • 全球基础设施
  • 信任中心
最佳实践
  • 精选案例
  • 超级探访
  • 云杂志
  • 分析师和白皮书
  • 天翼云·创新直播间
市场活动
  • 2025智能云生态大会
  • 2024智算云生态大会
  • 2023云生态大会
  • 2022云生态大会
  • 天翼云中国行
天翼云
  • 活动
  • 智算服务
  • 产品
  • 解决方案
  • 应用商城
  • 合作伙伴
  • 开发者
  • 支持与服务
  • 了解天翼云
      • 文档
      • 控制中心
      • 备案
      • 管理中心

      【多进程】Linux中fork()函数详解|多进程

      首页 知识中心 其他 文章详情页

      【多进程】Linux中fork()函数详解|多进程

      2025-02-26 07:20:49 阅读次数:9

      fork,printf,执行,进程

      一、fork入门知识

      一个进程,包括代码、数据和分配给进程的资源。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。

      一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同。相当于克隆了一个自己。

      我们来看一个例子:

      /*
      *  fork_test.c
      *  version 1
      *  Created on: 2010-5-29
      *      Author: wangth
      */
       
      #include <unistd.h>
      #include <stdio.h>
       
      int main ()
      {
          pid_t fpid; //fpid表示fork函数返回的值
          int count = 0;
          fpid = fork();
          if (fpid < 0)
              printf("error in fork!");
          else if (fpid == 0)
          {
              printf("i am the child process, my process id is %d/n", getpid());
              printf("我是爹的儿子/n");//对某些人来说中文看着更直白。
              count++;
          }
          else
          {
              printf("i am the parent process, my process id is %d/n", getpid());
              printf("我是孩子他爹/n");
              count++;
          }
          printf("统计结果是: %d/n", count);
          return 0;
      }

      运行结果是:

      i am the child process, my process id is 5574

      我是爹的儿子

      统计结果是: 1

      i am the parent process, my process id is 5573

      我是孩子他爹

      统计结果是: 1

      在语句fpid=fork()之前,只有一个进程在执行这段代码,但在这条语句之后,就变成两个进程在执行了,这两个进程的几乎完全相同,将要执行的下一条语句都是if(fpid<0)……
      为什么两个进程的fpid不同呢,这与fork函数的特性有关。

      fork调用的一个奇妙之处就是它仅仅被调用一次,却能够返回两次,它可能有三种不同的返回值:
          1)在父进程中,fork返回新创建子进程的进程ID;
          2)在子进程中,fork返回0;
          3)如果出现错误,fork返回一个负值;

      在fork函数执行完毕后,如果创建新进程成功,则出现两个进程,一个是子进程,一个是父进程。在子进程中,fork函数返回0,在父进程中,fork返回新创建子进程的进程ID。我们可以通过fork返回的值来判断当前进程是子进程还是父进程。

      引用一位网友的话来解释fpid的值为什么在父子进程中不同。其实就相当于链表,进程形成了链表,父进程的fpid(p 意味point)指向子进程的进程id,因为子进程没有子进程,所以其fpid为0。


      fork出错可能有两种原因:
          1)当前的进程数已经达到了系统规定的上限,这时errno的值被设置为EAGAIN。
          2)系统内存不足,这时errno的值被设置为ENOMEM。

      创建新进程成功后,系统中出现两个基本完全相同的进程,这两个进程执行没有固定的先后顺序,哪个进程先执行要看系统的进程调度策略。

      每个进程都有一个独特(互不相同)的进程标识符(process ID),可以通过getpid()函数获得,还有一个记录父进程pid的变量,可以通过getppid()函数获得变量的值。
      fork执行完毕后,出现两个进程:

      【多进程】Linux中fork()函数详解|多进程

      有人说两个进程的内容完全一样啊,怎么打印的结果不一样啊,那是因为判断条件的原因,上面列举的只是进程的代码和指令,还有变量啊。

      执行完fork后,进程1的变量为count=0,fpid!=0(父进程)。进程2的变量为count=0,fpid=0(子进程),这两个进程的变量都是独立的,存在不同的地址中,不是共用的,这点要注意。可以说,我们就是通过fpid来识别和操作父子进程的。

      还有人可能疑惑为什么不是从#include处开始复制代码的,这是因为fork是把进程当前的情况拷贝一份,执行fork时,进程已经执行完了int count=0;

      fork只拷贝下一个要执行的代码到新的进程。

      二、fork进阶知识

      先看一份代码:

      /*
      *  fork_test.c
      *  version 2
      *  Created on: 2010-5-29
      *      Author: wangth
      */
       
      #include <unistd.h>
      #include <stdio.h>
       
      int main(void)
      {
          int i = 0;
          printf("i son/pa ppid pid  fpid/n");
          //ppid指当前进程的父进程pid
          //pid指当前进程的pid,
          //fpid指fork返回给当前进程的值
          for(i = 0; i < 2; i++)
          {
              pid_t fpid = fork();
              if(fpid == 0)
                  printf("%d child  %4d %4d %4d/n", i, getppid(), getpid(), fpid);
              else
                  printf("%d parent %4d %4d %4d/n", i, getppid(), getpid(), fpid);
          }
          return 0;
      }

      运行结果是:

      i son/pa ppid pid  fpid
      0 parent 2043 3224 3225
      0 child  3224 3225    0
      1 parent 2043 3224 3226
      1 parent 3224 3225 3227
      1 child     1 3227    0
      1 child     1 3226    0

      这份代码比较有意思,我们来认真分析一下:

      第一步:在父进程中,指令执行到for循环中,i=0,接着执行fork,fork执行完后,系统中出现两个进程,分别是p3224和p3225(后面我都用pxxxx表示进程id为xxxx的进程)。可以看到父进程p3224的父进程是p2043,子进程p3225的父进程正好是p3224。我们用一个链表来表示这个关系:

      p2043->p3224->p3225

      第一次fork后,p3224(父进程)的变量为i=0,fpid=3225(fork函数在父进程中返向子进程id),代码内容为:

      for(i = 0; i < 2; i++)
      {
          pid_t fpid = fork(); //执行完毕,i=0,fpid=3225
          if(fpid == 0)
              printf("%d child  %4d %4d %4d/n", i, getppid(), getpid(), fpid);
          else
              printf("%d parent %4d %4d %4d/n", i, getppid(), getpid(), fpid);
      }
      return 0;

       p3225(子进程)的变量为i=0,fpid=0(fork函数在子进程中返回0),代码内容为:

      for(i = 0; i < 2; i++)
      {
          pid_t fpid = fork(); //执行完毕,i=0,fpid=0
          if(fpid == 0)
              printf("%d child  %4d %4d %4d/n", i, getppid(), getpid(), fpid);
          else
              printf("%d parent %4d %4d %4d/n", i, getppid(), getpid(), fpid);
      }
      return 0;

      所以打印出结果:

      0 parent 2043 3224 3225
      0 child  3224 3225    0

      第二步:假设父进程p3224先执行,当进入下一个循环时,i=1,接着执行fork,系统中又新增一个进程p3226,对于此时的父进程,p2043->p3224(当前进程)->p3226(被创建的子进程)。

      对于子进程p3225,执行完第一次循环后,i=1,接着执行fork,系统中新增一个进程p3227,对于此进程,p3224->p3225(当前进程)->p3227(被创建的子进程)。

      从输出可以看到p3225原来是p3224的子进程,现在变成p3227的父进程。父子是相对的,这个大家应该容易理解。只要当前进程执行了fork,该进程就变成了父进程了,就打印出了parent。

      所以打印出结果是:

      1 parent 2043 3224 3226
      1 parent 3224 3225 3227

      第三步:第二步创建了两个进程p3226,p3227,这两个进程执行完printf函数后就结束了,因为这两个进程无法进入第三次循环,无法fork,该执行return 0;了,其他进程也是如此。

      以下是p3226,p3227打印出的结果:

      1 child     1 3227    0
      1 child     1 3226    0

      细心的读者可能注意到p3226,p3227的父进程难道不该是p3224和p3225吗,怎么会是1呢?这里得讲到进程的创建和死亡的过程,在p3224和p3225执行完第二个循环后,main函数就该退出了,也即进程该死亡了,因为它已经做完所有事情了。p3224和p3225死亡后,p3226,p3227就没有父进程了,这在操作系统是不被允许的,所以p3226,p3227的父进程就被置为p1了,p1是永远不会死亡的,至于为什么,这里先不介绍,留到“三、fork高阶知识”讲。

      总结一下,这个程序执行的流程如下:

      【多进程】Linux中fork()函数详解|多进程

      这个程序最终产生了3个子进程,执行过6次printf()函数。

      我们再来看一份代码:

      /*
      *  fork_test.c
      *  version 3
      *  Created on: 2010-5-29
      *      Author: wangth
      */
       
      #include <unistd.h>
      #include <stdio.h>
       
      int main(void)
      {
          int i = 0;
          for(i = 0; i < 3; i++)
          {
              pid_t fpid = fork();
              if(fpid == 0)
                  printf("son/n");
              else
                  printf("father/n");
          }
          return 0;
       
      }

      它的执行结果是:

      father
      son
      father
      father
      father
      father
      son
      son
      father
      son
      son
      son
      father
      son


      这里就不做详细解释了,只做一个大概的分析。

          for        i=0         1           2
                    father     father     father
                                             son
                                  son     father
                                             son
                     son       father     father
                                             son
                                  son     father
                                             son
      其中每一行分别代表一个进程的运行打印结果。

      总结一下规律,对于这种N次循环的情况,执行printf函数的次数为2*(1+2+4+……+2N-1)次,创建的子进程数为1+2+4+……+2N-1个。

      (感谢gao_jiawei网友指出的错误,原本我的结论是“执行printf函数的次数为2*(1+2+4+……+2N)次,创建的子进程数为1+2+4+……+2N ”,这是错的)

      网上有人说N次循环产生2*(1+2+4+……+2N)个进程,这个说法是不对的,希望大家需要注意。

      同时,大家如果想测一下一个程序中到底创建了几个子进程,最好的方法就是调用printf函数打印该进程的pid,也即调用printf("%d/n",getpid());或者通过printf("+/n");

      来判断产生了几个进程。有人想通过调用printf("+");来统计创建了几个进程,这是不妥当的。具体原因我来分析。

      老规矩,大家看一下下面的代码:

      /*
      *  fork_test.c
      *  version 4
      *  Created on: 2010-5-29
      *      Author: wangth
      */
       
      #include <unistd.h>
      #include <stdio.h>
       
      int main()
      {
          pid_t fpid;//fpid表示fork函数返回的值
          //printf("fork!");
          printf("fork!/n");
          fpid = fork();
          if (fpid < 0)
              printf("error in fork!");
          else if (fpid == 0)
              printf("I am the child process, my process id is %d/n", getpid());
          else
              printf("I am the parent process, my process id is %d/n", getpid());
          return 0;
      }
      执行结果如下:
      fork!
      I am the parent process, my process id is 3361
      I am the child process, my process id is 3362

      如果把语句printf("fork!/n");注释掉,执行printf("fork!");

      则新的程序的执行结果是:

      fork!I am the parent process, my process id is 3298
      fork!I am the child process, my process id is 3299

      程序的唯一的区别就在于一个/n回车符号,为什么结果会相差这么大呢?

      这就跟printf的缓冲机制有关了,printf某些内容时,操作系统仅仅是把该内容放到了stdout的缓冲队列里了,并没有实际的写到屏幕上。

      但是,只要看到有/n 则会立即刷新stdout,因此就马上能够打印了。

      运行了printf("fork!")后,“fork!”仅仅被放到了缓冲里,程序运行到fork时缓冲里面的“fork!”  被子进程复制过去了。因此在子进程度stdout缓冲里面就也有了fork! 。所以,你最终看到的会是fork! 被printf了2次!!!!

      而运行printf("fork! /n")后,“fork!”被立即打印到了屏幕上,之后fork到的子进程里的stdout缓冲里不会有fork! 内容。因此你看到的结果会是fork! 被printf了1次!!!!

      所以说printf("+");不能正确地反应进程的数量。

      大家看了这么多可能有点疲倦吧,不过我还得贴最后一份代码来进一步分析fork函数。

      #include <stdio.h>
      #include <unistd.h>
       
      int main(int argc, char *argv[])
      {
          fork();
          fork() &&fork() || fork();
          fork();
          return 0;
      }

      问题是不算main这个进程自身,程序到底创建了多少个进程。

      为了解答这个问题,我们先做一下弊,先用程序验证一下,到此有多少个进程。

      #include <stdio.h>
       
      int main(int argc, char *argv[])
      {
          fork();
          fork() &&fork() || fork();
          fork();
          printf("+/n");
      }
      ​​​​​​​
      答案是总共20个进程,除去main进程,还有19个进程。
      

      我们再来仔细分析一下,为什么是还有19个进程。
      第一个fork和最后一个fork肯定是会执行的。
      主要在中间3个fork上,可以画一个图进行描述。
      这里就需要注意&&和||运算符。
      A&&B,如果A=0,就没有必要继续执行&&B了;A非0,就需要继续执行&&B。
      A||B,如果A非0,就没有必要继续执行||B了,A=0,就需要继续执行||B。
      fork()对于父进程和子进程的返回值是不同的,按照上面的A&&B和A||B的分支进行画图,可以得出5个分支。

       

      【多进程】Linux中fork()函数详解|多进程

          加上前面的fork和最后的fork,总共4*5=20个进程,除去main主进程,就是19个进程了。

      三、fork高阶知识

      这一块我主要就fork函数讲一下操作系统进程的创建、死亡和调度等。因为时间和精力限制,我先写到这里,下次找个时间我争取把剩下的内容补齐。

      版权声明:本文内容来自第三方投稿或授权转载,原文地址:https://blog.csdn.net/bandaoyu/article/details/109541053,作者:bandaoyu,版权归原作者所有。本网站转在其作品的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如因作品内容、版权等问题需要同本网站联系,请发邮件至ctyunbbs@chinatelecom.cn沟通。

      上一篇:python 提取出sql语句中where的值

      下一篇:在IE环境下用javascript触发ABAP event

      相关文章

      2025-05-16 09:15:24

      C语言-------如何打印保留小数点后1,2,..位

      C语言-------如何打印保留小数点后1,2,..位

      2025-05-16 09:15:24
      double , printf , 打印
      2025-05-16 09:15:10

      Linux系统基础-进程信号超详细讲解

      Linux系统基础-进程信号超详细讲解

      2025-05-16 09:15:10
      kill , 信号 , 命令 , 进程
      2025-05-14 10:03:13

      【Mybatis】-防止SQL注入

      【Mybatis】-防止SQL注入

      2025-05-14 10:03:13
      SQL , 执行 , 日志 , 注入 , 缓存 , 编译 , 语句
      2025-05-14 10:03:13

      AJAX-事件循环(超详细过程)

      JS有一个基于事件循环的并发模型,事件循环负责执行代码、收集和处理事件以及执行队列中的子任务。

      2025-05-14 10:03:13
      代码 , 任务 , 出栈 , 异步 , 执行 , 调用 , 队列
      2025-05-14 10:02:58

      Linux top 命令使用教程

      Linux top 是一个在Linux和其他类Unix 系统上常用的实时系统监控工具。它提供了一个动态的、交互式的实时视图,显示系统的整体性能信息以及正在运行的进程的相关信息。

      2025-05-14 10:02:58
      CPU , 信息 , 内存 , 占用 , 备注 , 进程
      2025-05-13 09:53:23

      一个python 程序执行顺序

      一个python 程序执行顺序

      2025-05-13 09:53:23
      Python , 代码 , 函数 , 循环 , 执行 , 语句
      2025-05-13 09:51:29

      ogg在启动应用进程时报错OGG-00412

      ogg在启动应用进程时报错OGG-00412

      2025-05-13 09:51:29
      ogg , OGG , 时报 , 进程
      2025-05-13 09:51:17

      无法启动ogg配置好的抓取以及投递进程

      无法启动ogg配置好的抓取以及投递进程

      2025-05-13 09:51:17
      ogg , 启动 , 抓取 , 进程
      2025-05-13 09:49:19

      内置变量_其他相关

      内置变量_其他相关

      2025-05-13 09:49:19
      参数 , 基础知识 , 实践 , 小结 , 脚本 , 进程
      2025-05-13 09:49:19

      内置变量_脚本相关

      内置变量_脚本相关

      2025-05-13 09:49:19
      shell , 实践 , 当前 , 执行 , 脚本 , 获取
      查看更多
      推荐标签

      作者介绍

      天翼云小翼
      天翼云用户

      文章

      33561

      阅读量

      5242151

      查看更多

      最新文章

      ogg在启动应用进程时报错OGG-00412

      2025-05-13 09:51:29

      【Linux 从基础到进阶】进程管理与性能调优

      2025-05-09 08:51:09

      MFC如何打开和关闭进程、动态获取进程号、关闭自身进程

      2025-05-07 09:08:16

      SQL—DQL之执行顺序(基础)

      2025-04-23 08:18:38

      Linux进程调度与等待:背后的机制与实现

      2025-04-22 09:27:28

      synchronized详解

      2025-04-22 09:27:28

      查看更多

      热门文章

      Linux进程间通信

      2023-05-23 09:46:32

      【Linux】ps -ef|grep详解

      2023-05-18 09:34:04

      Linux命令之终止进程kill

      2023-05-26 10:27:33

      echo&printf

      2023-05-04 08:59:25

      特殊权限

      2023-06-25 07:17:17

      Windows关于端口号被占用的问题

      2023-07-19 08:12:05

      查看更多

      热门标签

      linux java python javascript 数组 前端 docker Linux vue 函数 shell git 节点 容器 示例
      查看更多

      相关产品

      弹性云主机

      随时自助获取、弹性伸缩的云服务器资源

      天翼云电脑(公众版)

      便捷、安全、高效的云电脑服务

      对象存储

      高品质、低成本的云上存储服务

      云硬盘

      为云上计算资源提供持久性块存储

      查看更多

      随机文章

      linux 进程查看

      函数和进程之间的相似性(开拓你的视野)

      win10 下,根据 pid 杀死进程(8080抢占端口)---- java篇

      linux查看进程

      Linux学习之进程

      Linux内核之进程6: 深度睡眠

      • 7*24小时售后
      • 无忧退款
      • 免费备案
      • 专家服务
      售前咨询热线
      400-810-9889转1
      关注天翼云
      • 旗舰店
      • 天翼云APP
      • 天翼云微信公众号
      服务与支持
      • 备案中心
      • 售前咨询
      • 智能客服
      • 自助服务
      • 工单管理
      • 客户公告
      • 涉诈举报
      账户管理
      • 管理中心
      • 订单管理
      • 余额管理
      • 发票管理
      • 充值汇款
      • 续费管理
      快速入口
      • 天翼云旗舰店
      • 文档中心
      • 最新活动
      • 免费试用
      • 信任中心
      • 天翼云学堂
      云网生态
      • 甄选商城
      • 渠道合作
      • 云市场合作
      了解天翼云
      • 关于天翼云
      • 天翼云APP
      • 服务案例
      • 新闻资讯
      • 联系我们
      热门产品
      • 云电脑
      • 弹性云主机
      • 云电脑政企版
      • 天翼云手机
      • 云数据库
      • 对象存储
      • 云硬盘
      • Web应用防火墙
      • 服务器安全卫士
      • CDN加速
      热门推荐
      • 云服务备份
      • 边缘安全加速平台
      • 全站加速
      • 安全加速
      • 云服务器
      • 云主机
      • 智能边缘云
      • 应用编排服务
      • 微服务引擎
      • 共享流量包
      更多推荐
      • web应用防火墙
      • 密钥管理
      • 等保咨询
      • 安全专区
      • 应用运维管理
      • 云日志服务
      • 文档数据库服务
      • 云搜索服务
      • 数据湖探索
      • 数据仓库服务
      友情链接
      • 中国电信集团
      • 189邮箱
      • 天翼企业云盘
      • 天翼云盘
      ©2025 天翼云科技有限公司版权所有 增值电信业务经营许可证A2.B1.B2-20090001
      公司地址:北京市东城区青龙胡同甲1号、3号2幢2层205-32室
      • 用户协议
      • 隐私政策
      • 个人信息保护
      • 法律声明
      备案 京公网安备11010802043424号 京ICP备 2021034386号