一、fork入门知识

     一个进程,包括代码、数据和分配给进程的资源。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。
    一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同。相当于克隆了一个自己。

     我们来看一个例子:

[cpp] view plain copy
  1. /* 
  2.  *  fork_test.c 
  3.  *  version 1 
  4.  *  Created on: 2010-5-29 
  5.  *      Author: wangth 
  6.  */  
  7. #include <unistd.h>  
  8. #include <stdio.h>   
  9. int main ()   
  10. {   
  11.     pid_t fpid; //fpid表示fork函数返回的值  
  12.     int count=0;  
  13.     fpid=fork();   
  14.     if (fpid < 0)   
  15.         printf("error in fork!");   
  16.     else if (fpid == 0) {  
  17.         printf("i am the child process, my process id is %d/n",getpid());   
  18.         printf("我是爹的儿子/n");//对某些人来说中文看着更直白。  
  19.         count++;  
  20.     }  
  21.     else {  
  22.         printf("i am the parent process, my process id is %d/n",getpid());   
  23.         printf("我是孩子他爹/n");  
  24.         count++;  
  25.     }  
  26.     printf("统计结果是: %d/n",count);  
  27.     return 0;  
  28. }  

     运行结果是:
    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执行完毕后,出现两个进程,

    有人说两个进程的内容完全一样啊,怎么打印的结果不一样啊,那是因为判断条件的原因,上面列举的只是进程的代码和指令,还有变量啊。
    执行完fork后,进程1的变量为count=0,fpid!=0(父进程)。进程2的变量为count=0,fpid=0(子进程),这两个进程的变量都是独立的,存在不同的地址中,不是共用的,这点要注意。可以说,我们就是通过fpid来识别和操作父子进程的。
    还有人可能疑惑为什么不是从#include处开始复制代码的,这是因为fork是把进程当前的情况拷贝一份,执行fork时,进程已经执行完了int count=0;fork只拷贝下一个要执行的代码到新的进程。

二、fork进阶知识

    先看一份代码:

[cpp] view plain copy
  1. /* 
  2.  *  fork_test.c 
  3.  *  version 2 
  4.  *  Created on: 2010-5-29 
  5.  *      Author: wangth 
  6.  */  
  7. #include <unistd.h>  
  8. #include <stdio.h>  
  9. int main(void)  
  10. {  
  11.    int i=0;  
  12.    printf("i son/pa ppid pid  fpid/n");  
  13.    //ppid指当前进程的父进程pid  
  14.    //pid指当前进程的pid,  
  15.    //fpid指fork返回给当前进程的值  
  16.    for(i=0;i<2;i++){  
  17.        pid_t fpid=fork();  
  18.        if(fpid==0)  
  19.            printf("%d child  %4d %4d %4d/n",i,getppid(),getpid(),fpid);  
  20.        else  
  21.            printf("%d parent %4d %4d %4d/n",i,getppid(),getpid(),fpid);  
  22.    }  
  23.    return 0;  
  24. }  

    运行结果是:
    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),代码内容为:

[c-sharp] view plain copy
  1. for(i=0;i<2;i++){  
  2.     pid_t fpid=fork();//执行完毕,i=0,fpid=3225  
  3.     if(fpid==0)  
  4.        printf("%d child  %4d %4d %4d/n",i,getppid(),getpid(),fpid);  
  5.     else  
  6.        printf("%d parent %4d %4d %4d/n",i,getppid(),getpid(),fpid);  
  7. }  
  8. return 0;  

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

[c-sharp] view plain copy
  1. for(i=0;i<2;i++){  
  2.     pid_t fpid=fork();//执行完毕,i=0,fpid=0  
  3.     if(fpid==0)  
  4.        printf("%d child  %4d %4d %4d/n",i,getppid(),getpid(),fpid);  
  5.     else  
  6.        printf("%d parent %4d %4d %4d/n",i,getppid(),getpid(),fpid);  
  7. }  
  8. 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高阶知识”讲。
    总结一下,这个程序执行的流程如下:

     这个程序最终产生了3个子进程,执行过6次printf()函数。
    我们再来看一份代码:

[cpp] view plain copy
  1. /* 
  2.  *  fork_test.c 
  3.  *  version 3 
  4.  *  Created on: 2010-5-29 
  5.  *      Author: wangth 
  6.  */  
  7. #include <unistd.h>  
  8. #include <stdio.h>  
  9. int main(void)  
  10. {  
  11.    int i=0;  
  12.    for(i=0;i<3;i++){  
  13.        pid_t fpid=fork();  
  14.        if(fpid==0)  
  15.            printf("son/n");  
  16.        else  
  17.            printf("father/n");  
  18.    }  
  19.    return 0;  
  20.   
  21. }  

     它的执行结果是:
    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+……+2”,这是错的)
    网上有人说N次循环产生2*(1+2+4+……+2N)个进程,这个说法是不对的,希望大家需要注意。

    数学推理见http://202.117.3.13/wordpress/?p=81(该博文的最后)。
    同时,大家如果想测一下一个程序中到底创建了几个子进程,最好的方法就是调用printf函数打印该进程的pid,也即调用printf("%d/n",getpid());或者通过printf("+/n");来判断产生了几个进程。有人想通过调用printf("+");来统计创建了几个进程,这是不妥当的。具体原因我来分析。
    老规矩,大家看一下下面的代码:

[cpp] view plain copy
  1. /* 
  2.  *  fork_test.c 
  3.  *  version 4 
  4.  *  Created on: 2010-5-29 
  5.  *      Author: wangth 
  6.  */  
  7. #include <unistd.h>  
  8. #include <stdio.h>  
  9. int main() {  
  10.     pid_t fpid;//fpid表示fork函数返回的值  
  11.     //printf("fork!");  
  12.     printf("fork!/n");  
  13.     fpid = fork();  
  14.     if (fpid < 0)  
  15.         printf("error in fork!");  
  16.     else if (fpid == 0)  
  17.         printf("I am the child process, my process id is %d/n", getpid());  
  18.     else  
  19.         printf("I am the parent process, my process id is %d/n", getpid());  
  20.     return 0;  
  21. }  

    执行结果如下:
    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函数。

[cpp] view plain copy
  1. #include <stdio.h>  
  2. #include <unistd.h>  
  3. int main(int argc, char* argv[])  
  4. {  
  5.    fork();  
  6.    fork() && fork() || fork();  
  7.    fork();  
  8.    return 0;  
  9. }  

    问题是不算main这个进程自身,程序到底创建了多少个进程。
    为了解答这个问题,我们先做一下弊,先用程序验证一下,到此有多少个进程。

[c-sharp] view plain copy
  1. #include <stdio.h>  
  2. int main(int argc, char* argv[])  
  3. {  
  4.    fork();  
  5.    fork() && fork() || fork();  
  6.    fork();  
  7.    printf("+/n");  
  8. }  

    答案是总共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个分支。

    

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

三、fork高阶知识

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

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. __VA_ARGS__ 與 ## 小檔案

    转自:http://www.cash.idv.tw/wordpress/?p=1531我大致整理出要點, 供急功近利的新手參考.1. __VA_ARGS__ 顧名思義, 就是一個可變的參數.例如: #define ABC(format,…) printf(format, __VA_ARGS__);注意最後這個分號.2. 假如實際參數是 0 的話, 會發生下面的問題ABC(“%s…...

    2024/4/26 17:36:34
  2. button文字多行显示

    button.titlelabel.linebreakmode = 0; 转载于:https://www.cnblogs.com/rgshio/p/4729358.html...

    2024/4/28 13:37:52
  3. fprintf、printf、sprintf、fscanf、scanf、sscanf 格式化输入输出

    格式化输入输出 1. fprintf(格式化输出数据至文件) 相关函数 printf,fscanf,vfprintf 表头文件 #include<stdio.h> 定义函数 int fprintf(FILE * stream, const char * format,.......); 函数说明 fprintf()会根据参数format字符串来转换并格式化数据,…...

    2024/5/1 1:36:04
  4. 纠结的很

    自从微软要关闭Spaces以来,wordpress,blogbus,csdn,还有这儿,来回折腾。 没有一个如意的,虽然之前在Spaces上也是自娱自乐。 最近算是找到个安家之处google appspot,完全就是我想要的。 想要看看的朋友欢迎点击这儿...

    2024/4/28 19:11:32
  5. Google推出中国?Exactly Right!

    今天早晨打开电脑看到的最震惊的消息无外乎就是Google宣布在中国不再审查搜索结果,而此举导致的可能就是不得不关闭Google.cn和在中国的Office。这些天的中国互联网真是多事之秋啊:百度被黑,Google翻脸,我天朝官方进一步扫黄,因此屏蔽了更多的国外技术网站如wired.com,Te…...

    2024/4/26 13:14:51
  6. Apache将整合Google Wave功能

    北京时间11月25日消息,据国外媒体报道,谷歌于今年8月宣布关闭在线实时沟通协作服务Google Wave。但开源项目Apache软件基金会日前宣布将推出一款类似于Google Wave的服务,在其开源软件Apache中整合Wave技术。分析称这一新服务将使Google Wave在线协作概念重获新生。Google W…...

    2024/4/29 0:17:04
  7. Markdown常用语法学习笔记(标题、字体、列表、链接、图片、表格、待办事项、引用、插入甘特图、流程图)

    文章目录Markdown简介历史应用特别提醒Markdown 标题使用 = 和 - 标记一级和二级标题使用 # 号标记标题(可表示 1-6 级标题)Markdown 段落、字体等样式Markdown 段落Markdown 段落语法Markdown 段落显示效果Markdown 字体Markdown 字体语法Markdown 字体显示效果Markdown分隔…...

    2024/4/19 15:32:20
  8. 使用AppCan自带的升级功能实现移动端升级

    1.需要在AppCan项目的config.xml文件中设置“更新地址”,即在执行uexWidget.checkUpdate();时访问的后台页面地址,比如:http://192.168.0.10:8888/XXXX/servlet/CheckUpdateServlet 2.在后台CheckUpdateServlet.java文件中A.获取移动端自带的两个参数:ver,platformString o…...

    2024/5/2 11:16:53
  9. DCloud,ApiCloud,AppCan,Bingotouch,Cordova分别是什么?他们的优缺点分别什么?

    目录ApiCloud :App定制平台APP开发平台DCloud :APPCan :Bingotouch :Cordova:ApiCloud :App定制平台它是APICloud在已有的移动应用开发平台上,推出的全新服务体系。App定制平台为企业提供在线APP定制开发服务。服务特色一是帮助企业客户免费梳理APP开发需求,输出评估报告;二…...

    2024/5/3 0:04:24
  10. AppCan_3 传统的流式布局 与 弹性盒子

    在传统的流式布局,由内容决定容器布局的大小,弹性盒子恰好相反,它是由父容器分配大小,再由父容器给子容器分配大小, 看一个示例 在AppCan, phone目录下,增加一个html页面: 弹性盒子和流式布局.html <!DOCTYPE html> <html><head><meta charset=&…...

    2024/4/30 10:54:43
  11. zabbix安装

    前期安装: mysql:http://blog.csdn.net/locky_lll/article/details/78529363 apapche:http://blog.csdn.net/locky_lll/article/details/78537950 php7:http://blog.csdn.net/locky_lll/article/details/78548704官网上有使用rpm包安装过程,这篇文章使用的是源码包安装.首先,因…...

    2024/4/29 14:49:30
  12. 关于appcan的插件开发

    1.插件开发当去掉插件开发模板当中的-objc的时候插件不能调用。...

    2024/4/27 16:16:56
  13. AppCan移动应用开发平台新增9个超实用插件(内含示例代码)

    使用AppCan平台进行移动开发,你所需要具备的是Html5+CSS +JS前端语言基础,此外,Hybrid混合模式应用还需结合原生语言对功能模块进行封装,对于没有原生基础的开发者,如何实现App里包括支付、界面布局、地图导航、IM等功能呢?这里列出9个AppCan新插件,在使用AppCan平台进行…...

    2024/4/19 15:32:14
  14. 浅谈appcan4.0新版本的上拉加载和下拉刷新

    由于公司用到appcan的框架,顺便学了下框架的MVVM,appcan的MVVM是基于backBone.js进行封装的。废话不多说了,贴出js代码。 在viewModel里events事件里加载上拉加载和下拉刷新代码: var ViewModel_Fj17Ja = new(MVVM.ViewModel.extend({el: "#ScrollContent",event…...

    2024/4/27 23:08:47
  15. 移动端布局字体单位的选择之px、rem和em揭秘

    一般我们在pc上主要是流动式布局,采用的单位一般都是px,由于pc屏幕都是很大的,所以不用过多的担心字体单位的选择,但是在移动端呢?那么这完全相反,由于手机屏幕较小,且各种屏幕尺寸你一不小心你布局的样式或者单位字体显得过大这都不是很理想的。那么我们就来说下移动端…...

    2024/4/30 20:50:25
  16. appcan 版本跟新

    uexWidgetOne.getPlatform();//获取平台版本(step:1) uexWidgetOne.cbGetPlatform= function(opId, dataType, data) { varupdate = 0; if(data == 1) { update= 1; …...

    2024/4/29 19:05:07
  17. AppCan赵庆华: Hybrid 混合开发正当时

    巨大的市场对于App开发服务提供商来说是绝佳的机遇。AppCan作为国内混合开发的领导品牌,同时服务开发者B2D和企业级B2B市场,提供移动应用开发平台和企业移动整体解决方案。多年来,AppCan一直把降低APP开发的技术门槛、降低企业的移动化成本作为研发目标,致力打造一体化、一…...

    2024/4/28 3:52:15
  18. Appcan 接口分析 第三方登陆整合

    引用JSSDK javascript 文件 open.appcan.cn 申请appId js接口中会用到 在你的html 网页的头部标签中引入js代码2 调用获得sessionKey的接口 在js代码中先调用获得sessionKey的接口,保存好此值,其它接口会调用。。。 TX.getSessionKey (appId, callback) appcan开放平台se…...

    2024/4/29 11:51:04
  19. 【免费直播课】AppCan基础课程之第四讲 界面布局2

    小伙伴们, 开工大吉!AppCan网络直播课第四期来了,本期继续讲解界面布局,请大家锁定时间,收看我们的节目~【界面布局之栅格系统】报名地址:http://ke.qq.com/cgi-bin/courseDetail?course_id=56760直播时间:3月10日19:00课程目标:加强对弹性盒子与流式布局的对比认识,…...

    2024/4/28 19:12:41
  20. 掌握这两个技术点,你可以玩转AppCan前端开发

    “AppCan的前端开发其实非常简单,只要掌握两方面的技术即可。一方面是会使用栅格布局完成UI的界面排版,另外一方面就是使用AppCan MVVM模型来完成整个页面构造和用户操作逻辑。”在2016AppCan移动开发者大会的技术脱口秀环节, AppCan技术副总监陈雪分享了自己从事AppCan技术…...

    2024/5/3 0:04:10

最新文章

  1. 【数据结构】:链表的带环问题

    &#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;数据结构 &#x1f337;追光的人&#xff0c;终会万丈光芒 前言&#xff1a; 链表的带环问题在链表中是一类比较难的问题&#xff0c;它对我们的思维有一个比较高的要求&#xff0c;但是这一类…...

    2024/5/3 0:18:42
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. Vue3学习笔记+报错记录

    文章目录 1.创建Vue3.0工程1.1使用vue-cli创建1.2 使用vite创建工程1.3.分析Vue3工程结构 2.常用Composition2.1 拉开序幕的setup2.2 ref函数_处理基本类型2.3 ref函数_处理对象类型2.4 ref函数使用总结 1.创建Vue3.0工程 1.1使用vue-cli创建 查看vue/cli版本&#xff0c;确保…...

    2024/4/30 17:15:04
  4. Nginx配置文件修改结合内网穿透实现公网访问多个本地web站点

    文章目录 1. 下载windows版Nginx2. 配置Nginx3. 测试局域网访问4. cpolar内网穿透5. 测试公网访问6. 配置固定二级子域名7. 测试访问公网固定二级子域名 1. 下载windows版Nginx 进入官方网站(http://nginx.org/en/download.html)下载windows版的nginx 下载好后解压进入nginx目…...

    2024/5/1 13:14:34
  5. 对于布局的见解

    position: absolute;元素的宽度变为content的宽度,这是与position:relative(100%)不同的地方,若要呈现为100%, 有两个方法: 1.直接设置 width:100% 2.设置left:0px right:0px; 布局参看http://www.zhangxinxu.com/study/201010/mini-blog-no-width.html 采用无宽度布局…...

    2024/5/1 23:57:46
  6. 不同浏览器中网页内容高度取值

    原文地址:http://www.alisdn.com/wordpress/?p=1700关于浏览器的clientHeight、offsetHeight和scrollHeight在IE、FireFox、Netscape等不同的浏览器里,对于document.body 的 clientHeight、offsetHeight 和scrollHeight 有着不同的含义,比较容易搞混,现整理一下相关的内容…...

    2024/4/28 5:01:39
  7. 在网页中使用SVG技术

    在网页中使用SVG技术分享:0可缩放矢量图形(SVG)是矢量图形家族的一部分。相比其他光栅图形(JPEG、GIF 和 PNG),SVG 图形具有更多的优势。本文将探讨 SVG 图形的基本概念和在 HTML5 中的使用。学习绘制、过滤器、渐变、文本和将 SVG XML 添加到网页。 简介 可缩放矢量图形…...

    2024/4/28 18:58:36
  8. 瀑布流布局实现的三种方式

    瀑布流布局的特点? 答:首先,是图片的宽度固定,图片的长度不一样。其次,是当页面滚动时 ,会再次加载数据,动态的渲染在页面上。瀑布流布局的原理? 首先,获取图片的固定的宽度W,网页body的clientWidth 其次,获取在你的版面中显示多少列图片。cols = clientHeight / W;…...

    2024/5/1 15:08:20
  9. 移动web图片高度自适应的解决方案

    由于图片的加载是在dom加载完成之后进行的,于是,在手机端浏览网页时,经常会看到页面刚打开时很多内容叠在一起,当图片加载完成后,页面会由于图片加载完成出现明显的抖动针对这个问题,有以下几种解决方案媒体查询+px rem vm padding 媒体查询+px@media screenand(max - wi…...

    2024/4/30 5:31:04
  10. 网页布局之》》》》弹性盒子》》》

    网页弹性盒子》》》》box-flex 属性 按比例占据父元素的尺寸。1,(纵向)水平方向的弹性布局:先给其父元素设置样式为弹性盒子display:box; #father{ display:-webkit-box; display: box;}》》》》》》》子元素(div或盒子)默认是纵向挨着排列的,。》》》》》》定义两个可…...

    2024/5/2 0:25:03
  11. 在xcode中格式化代码

    1. 安装homebrew/usr/bin/ruby -e "$(curl -fsSkL raw.github.com/mxcl/homebrew/go)"2. 安装uncrustifybrew install uncrustify3. 下载配置好的workflow包http://by-igotit.com/wordpress/wp-content/uploads/2012/03/Uncrustify-Objective-C.workflow.tar.gz4. 解…...

    2024/5/2 10:05:21
  12. css content

    before after demo 1 添加描述信息div1:after{conent:"天假额外的文字"}2 也可以显示元素的某些属性<a class="div1" href="http://www.baidu.com"></a>div1:after{ content:attr(href)}注意:当使用attr()获取标签属性名的时候,千…...

    2024/4/28 2:33:44
  13. web PC分页功能实现。动态加载数据列表并分页

    1.最终效果图展示:2.代码截图:3.代码文字:<!DOCTYPE HTML> <HTML><head> <meta charset="utf-8"> <meta name="keywords" content="分页教程"> <meta name="description" content="CSDN平…...

    2024/4/30 20:50:13
  14. 周末作业

    ```<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Polp360首页</title> <link rel="stylesheet" type="text/css" href="css/reset.css">…...

    2024/4/28 23:52:18
  15. 提高JavaScript性能的30个技巧

    今天我们来看看 JavaScript,这项神奇而又复杂的技术。它使网站内容更加丰富,但常常出现的运行性能问题又降低了用户的体验。事实已经证明,最佳的终端用户体验能提升网站的转换率、Google搜索排名以及访问者的满意度。高性能的JavaScript意味着会给您和您的公司带来更多更好的…...

    2024/4/28 1:20:12
  16. PHP 性能分析第三篇: 性能调优实战

    注意:本文是我们的 PHP 性能分析系列的第三篇,点此阅读 PHP 性能分析第一篇: XHProf & XHGui 介绍 ,或 PHP 性能分析第二篇: 深入研究 XHGui 。 在本系列的 第一篇 中,我们介绍了 XHProf 。而在 第二篇 中,我们深入研究了 XHGui UI, 现在最后一篇,让我们把 XHProf …...

    2024/4/29 0:17:40
  17. 读《软星七年》有感

    看完这篇好友推荐的文章,一口气细读下来,心中时而豪气激昂,时而酸痛万分,真是感慨良多,只知道现在心中有说不完的话。。。 "...8月3日,北京举行《仙四》首发签售活动,张毅君如约到场。活动中,一位玩家表示愿意出钱捐助上海软星,支持《仙剑》的研发,被婉拒后,他…...

    2024/4/28 19:11:29
  18. Docker命令行

    Docker命令行(sudo)Docker容器命令行1.查看Docker服务是否正常2.运行容器(docker run -i -t 镜像名称 命令代码)3.使用容器4.查看当前系统中存在的容器:5.容器命名6.启动已停止的容器7.进行容器内部命令行8.创建守护式容器(长期运行的容器)9.查看容器日志10.查看容器内进…...

    2024/4/27 21:14:28
  19. 利用qemu写mips汇编程序控制malta显示器

    hello world不会写,先玩玩malta虚拟器上的跑马灯,就是qemu起来后ctrl+atl+5切换出来那个,安装debian mips版本后会有个"LINUX ON MALTA"在那一直循环。参考之前的文章,windows和linux下都有qemu,gnu的交叉编译工具也都有,所以两个平台应该都能跑。本文参考了:…...

    2024/4/29 11:53:38
  20. Redis 常见面试题整理

    1 什么是 Redis?简述它的优缺点?Redis 的全称是:Remote Dictionary.Server,本质上是一个 Key-Value 类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据 flush 到硬盘上进行保存。因为是纯内存操作,Redis 的性能非常出…...

    2024/4/27 23:06:58
  21. Redis 常见面试题

    今天跟大家分享下Redis 常见面试题的知识。 1 什么是 Redis?简述它的优缺点? Redis 的全称是:Remote Dictionary.Server,本质上是一个 Key-Value 类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据 flush 到硬盘上进行…...

    2024/4/29 2:38:01
  22. OneAPM大讲堂 | 提高JavaScript性能的30个技巧

    文章系国内领先的 ITOM 管理平台供应商 OneAPM 编译呈现。 您是网站管理员还是网页开发人员?想创建超快速的网站吗? 今天我们来看看 JavaScript,这项神奇而又复杂的技术。它使网站内容更加丰富,但常常出现的运行性能问题又降低了用户的体验。事实已经证明,最佳的终端用户体…...

    2024/4/28 1:29:09
  23. 面试之Redis

    什么是 Redis?简述它的优缺点? Redis 的全称是:Remote Dictionary.Server,本质上是一个 Key-Value 类型的内存数据库,很像 memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据 flush 到硬盘上进行保存。 因为是纯内存操作,Redis 的性能非常…...

    2024/5/3 0:03:58
  24. 读完这46道Redis面试题之后,你就会觉得自己的Redis白学了

    前言今天跟大家分享下Redis 常见面试题的知识,总共46道,希望大家能够喜欢。1 什么是 Redis?简述它的优缺点?Redis 的全称是:Remote Dictionary.Server,本质上是一个 Key-Value 类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作…...

    2024/5/1 19:48:16
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57