精华内容
下载资源
问答
  • 载入内存,让程序运行起来

    千次阅读 2016-09-22 23:42:45
    那么,QQ是怎么运行起来的呢? 首先,有一点你要明确,你安装的QQ软件是保存在硬盘中的。 双击QQ图标,操作系统就会知道你要运行这个软件,它会在硬盘中找到你安装的QQ软件,将数据(安装的软件本质上就是很多数据...

    转载于:C语言中文网高级部分。

    如果你的电脑上安装了QQ,你希望和好友聊天,会双击QQ图标,打开QQ软件,输入账号和密码,然后登录就可以了。

    那么,QQ是怎么运行起来的呢?

    首先,有一点你要明确,你安装的QQ软件是保存在硬盘中的。

    双击QQ图标,操作系统就会知道你要运行这个软件,它会在硬盘中找到你安装的QQ软件,将数据(安装的软件本质上就是很多数据的集合)复制到内存。对!就是复制到内存!QQ不是在硬盘中运行的,而是在内存中运行的。

    为什么呢?因为内存的读写速度比硬盘快很多。

    对于读写速度,内存 > 固态硬盘 > 机械硬盘。机械硬盘是靠电机带动盘片转动来读写数据的,而内存条通过电路来读写数据,电机的转速肯定没有电的传输速度(几乎是光速)快。虽然固态硬盘也是通过电路来读写数据,但是因为与内存的控制方式不一样,速度也不及内存。

    所以,不管是运行QQ还是编辑Word文档,都是先将硬盘上的数据复制到内存,才能让CPU来处理,这个过程就叫作载入内存(Load into Memory)。完成这个过程需要一个特殊的程序(软件),这个程序就叫做加载器(Loader)。

    CPU直接与内存打交道,它会读取内存中的数据进行处理,并将结果保存到内存。如果需要保存到硬盘,才会将内存中的数据复制到硬盘。

    例如,打开Word文档,输入一些文字,虽然我们看到的不一样了,但是硬盘中的文档没有改变,新增的文字暂时保存到了内存,Ctrl+S才会保存到硬盘。因为内存断电后会丢失数据,所以如果你编辑完Word文档忘记保存就关机了,那么你将永远无法找回这些内容。

    虚拟内存

    如果我们运行的程序较多,占用的空间就会超过内存(内存条)容量。例如计算机的内存容量为2G,却运行着10个程序,这10个程序共占用3G的空间,也就意味着需要从硬盘复制 3G 的数据到内存,这显然是不可能的。

    操作系统(Operating System,简称 OS)为我们解决了这个问题:当程序运行需要的空间大于内存容量时,会将内存中暂时不用的数据再写回硬盘;需要这些数据时再从硬盘中读取,并将另外一部分不用的数据写入硬盘。这样,硬盘中就会有一部分空间用来存放内存中暂时不用的数据。这一部分空间就叫做虚拟内存(Virtual Memory)。

    3G - 2G = 1G,上面的情况需要在硬盘上分配 1G 的虚拟内存。

    硬盘的读写速度比内存慢很多,反复交换数据会消耗很多时间,所以如果你的内存太小,会严重影响计算机的运行速度,甚至会出现”卡死“现象,即使CPU强劲,也不会有大的改观。如果经济条件允许,建议将内存升级为 4G,在 win7、win8 下运行软件就会比较流畅了。


    总结:CPU直接从内存中读取数据,处理完成后将结果再写入内存。

    图1:CPU、内存、硬盘和主板的关系

    展开全文
  • 我该怎么样把程序起来呢? 1. 进入apache2.4子目录htdocs下,新建php程序 打开编辑器 echo "Hello World"; ?> 保存为test.php 2.打开浏览器 输入http://localhost/test.php 就可以运行了 问题二: 环
    

    问题一:
    装了PHP5.5,apache2.4,MySQl,PHP环境也配好了。我该怎么样把程序跑起来呢?

    1. 进入apache2.4子目录htdocs下,新建php程序
    打开编辑器
    <?php
    echo "Hello World";
    ?>
    保存为test.php

    2.打开浏览器
    输入
    http://localhost/test.php
    就可以运行了


    问题二:

    环境搭建没有问题,php程序打开浏览器输入http://localhost/test.php为什么页面没显示?

    原因:

    1.apache的配置出现问题,详细问题和解决方案建问题三

    2.php文件没有放在htdocs目录下面

    3.httpd.conf配置错误,重新配置,注意在最后几行加入:

    LoadModule php5_module "F:/phptools/php5.5/php5apache2_4.dll"
    AddType application/x-httpd-php .php .html .htm
    PHPIniDir "F:/phptools/php5.5"
    Action application/x-httpd-php "/php/php.exe"

    4.端口号改了但是在网址中没有写出


    我的原因是第4点





      问题三:
    apache的配置正确,但是出现“the requested operation has failed”,用命令行执行httpd -t 返回syntax ok 配置应该没问题,但是点击start按钮apache还是会出现“the requested operation has failed”。
    消息栏里显示“the apache2.2 service is starting”

     
    本地服务里apache的服务状态是灰的。

    原因一:80端口占用 ,例如IIS,迅雷
    解决方案:

    1,.   80端在cmd命令行输入 netstat -ano  可以看到有一列为pid,在localaddress列下找到对应的80端口号。
    然后到任务管理器中 查看→选择列→把pid(进程标识符) 勾上。然后就可以看到是那个程序占用了80了。


    用此方法没有找到端口号为80的程序。。。。。。



    2. 改变Apache端口

    找到Apache安装目录下conf目录下的httpd.conf文件。打开找到“Listen”,紧接Listen的数字就是端口号,默认状态下为“Listen 80”。在之前的PHP专题中提到过关于在安装配置Apache时会遇到端口与IIS HTTP端口冲突的问题,因为IIS HTTP端口默认也为80。那么我们就可以在这里改变Apache的端口,从而避免冲突,比如可以改成:Listen 8011。
    改好之后别忘重起Apache服务使得配置生效!!!


    原因二:软件冲突
    装了某些软件会使apache无法启动如Dr.com 你打开网络连接->TcpIp属性->高级->WINS标签 把netbios的lmhosts对勾去掉,禁用tcp/ip的netbios. 然后再启动应该就可以了。

    原因三:httpd.conf配置错误
    如果apache的配置文件httpd.conf搞错了,在windows里启动它,会提示the requested operation has failed ,这是比较郁闷的事,因为查错要看个半天。
    其实可以用命令行模式启动apache,并带上参数,apache会提示你哪句有误,然后就可以针对性的解决,命令如下: httpd.exe -w -n "Apache2" -k start

    还有一种情况:
    即使你这次启动了,下次你都有可能启动失败
    在运行里输入:netsh winsock reset
    一会儿cmd会提示你重启,不用理会,现在APACHE已经可以启动了。
    其实就是一个winsock的修复





    展开全文
  • 一个java程序是怎样运行起来的(1)

    万次阅读 2017-04-17 21:58:01
    一个java程序是怎样运行起来

    首先编写一测试程序

    public class Test {
    	
    	public static void main(String[] args){
    		System.out.println("test");
    	}
        
    }
    执行javac Test.java 得到Test.class文件(编译过程有点复杂,这里先不看)

    执行java Test,控制台输出"test",想要弄清楚java程序是怎么运行起来首先得了解清楚class文件

    看下Test.class里究竟是什么东西,class文件的内容如下:


    上图中都是以16进制表示,接下来挨个分析其中的内容表示什么意思。class文件中存储的数据可以参考下表:

    类型 名称 数量
    u4 magic 1
    u2 class_minor_version 1
    u2 class_major_version 1
    u2 constant_pool_count 1
    cp_info constant_pool constant_pool_count - 1
    u2 access_flags 1
    u2 this_class 1
    u2 super_class 1
    u2 interfaces_count 1
    u2 interfaces interfaces_count
    u2 fields_count 1
    field_info fields fields_count
    u2 methods_count 1
    method_info methods methods_count
    u2 attribute_count 1
    attribute_info attributes attributes_count

    1、magic 魔数

    CA FE BA BE

    魔数,确定该文件是否是虚拟机可以接受的文件

    2、class文件版本信息

    00 00 00 33

    class文件的版本号,51表示jdk1.7.0

    3、常量池

    3.1常量池入口

    00 1D

    常量池数量为29-1=28,每个类只有一个常量池

    常量池中放了字符串,常量值,类名称,字段名,方法名等,反编译下Test.class,看看常量池中存放了哪些东西

    Constant pool:
       #1 = Methodref          #6.#15         //  java/lang/Object."<init>":()V
       #2 = Fieldref           #16.#17        //  java/lang/System.out:Ljava/io/PrintStream;
       #3 = String             #18            //  test
       #4 = Methodref          #19.#20        //  java/io/PrintStream.println:(Ljava/lang/String;)V
       #5 = Class              #21            //  Test
       #6 = Class              #22            //  java/lang/Object
       #7 = Utf8               <init>
       #8 = Utf8               ()V
       #9 = Utf8               Code
      #10 = Utf8               LineNumberTable
      #11 = Utf8               main
      #12 = Utf8               ([Ljava/lang/String;)V
      #13 = Utf8               SourceFile
      #14 = Utf8               Test.java
      #15 = NameAndType        #7:#8          //  "<init>":()V
      #16 = Class              #23            //  java/lang/System
      #17 = NameAndType        #24:#25        //  out:Ljava/io/PrintStream;
      #18 = Utf8               test
      #19 = Class              #26            //  java/io/PrintStream
      #20 = NameAndType        #27:#28        //  println:(Ljava/lang/String;)V
      #21 = Utf8               Test
      #22 = Utf8               java/lang/Object
      #23 = Utf8               java/lang/System
      #24 = Utf8               out
      #25 = Utf8               Ljava/io/PrintStream;
      #26 = Utf8               java/io/PrintStream
      #27 = Utf8               println
      #28 = Utf8               (Ljava/lang/String;)V
    常量池中的项目类型有:
    CONSTANT_Utf8_info      tag标志位为1,   UTF-8编码的字符串,比如类或接口的全限定名,参数名等
    CONSTANT_Integer_info  tag标志位为3, int整型字面量
    CONSTANT_Float_info     tag标志位为4, float浮点型字面量
    CONSTANT_Long_info     tag标志位为5, long长整形字面量
    CONSTANT_Double_info  tag标志位为6, double双精度字面量
    CONSTANT_Class_info    tag标志位为7, 类或接口的符号引用,指向包含字符串字面值的CONSTANT_Utf8表
    CONSTANT_String_info    tag标志位为8,字符串类型的字面量,指向包含字符串字面值的CONSTANT_Utf8表
    CONSTANT_Fieldref_info  tag标志位为9,  字段的符号引用,指向包含该字段所属类名的CONSTANT_Utf8表
    CONSTANT_Methodref_info  tag标志位为10,类中方法的符号引用,指向包含该方法所属类型的CONSTANT_Utf8表
    CONSTANT_InterfaceMethodref_info tag标志位为11, 接口中方法的符号引用

    CONSTANT_NameAndType_info  tag 标志位为12,字段和方法的名称以及类型的符号引用

    3.2常量池内容

    接上,继续分析class中的内容,参照 jvm官方文档 ,看下常量池中究竟是什么东西

    常量池1-----0A 00 06 00 0F   //

      1,0A---tag为10,表示第一个常量类型为CONSTANT_Methodref,参照官方文档,CONSTANT_Methodref的结构为

    CONSTANT_Methodref_info {
        u1 tag;
        u2 class_index;
        u2 name_and_type_index;
    }
    所以后面跟了4个字节

      2,00 06---声明当前方法类描述符索引值为6     //  java/lang/Object

      3,00 0F---当前方法的名称和类型索引值为15  //  "<init>":()V

    所以,结合上文中反编译出的内容来看,这几个16进制翻译过来正好是

    #1 = Methodref          #6.#15         //  java/lang/Object."<init>":()V

    常量池2----09 00 10 00 11

      1,09---tag为9,类型为CONSTANT_Fieldref

      2,00 10---声明当前方法类描述符索引值为16 // java/lang/System

      3,00 11---字段描述符的名称和类型索引值为17 //  out:Ljava/io/PrintStream;

    这几个16进制翻译过来正好是

    #2 = Fieldref           #16.#17        //  java/lang/System.out:Ljava/io/PrintStream;


    常量池3---08 00 12

       1,08---tag为8,类型为CONSTANT_String,根据官方文档,其结构为

    CONSTANT_String_info {
        u1 tag;
        u2 string_index;
    }
    所以后面跟了两个字节

       2,00 12---声明当前String值所在的索引值为18

    当前16进制翻译过来,表示

    #3 = String             #18            //  test


    常量池4---0A  00 13 00 14,对照着上面的分析,

    #4 = Methodref          #19.#20        //  java/io/PrintStream.println:(Ljava/lang/String;)V

    常量池5---07 00 15

       1,07---tag为7,类型为CONSTANT_Class,根据官方文档,其结构为

    CONSTANT_Class_info {
        u1 tag;
        u2 name_index;
    }
       2,00 15----当前类名称的索引值为21

    #5 = Class              #21            //  Test


    常量池6---07 00 16,对照上面的分析

    #6 = Class              #22            //  java/lang/Object

    常量池7---01 00 06 3C 69 6E 69 74 3E

      1,01---tag为1,类型为CONSTANT_Utf8,根据官方文档

    CONSTANT_Utf8_info {
        u1 tag;
        u2 length;
        u1 bytes[length];
    }
      2,06---表示字符串的长度为6

      3,3C 69 6E 69 74 3E ---字符串<init>

    #7 = Utf8               <init>

    常量池8---01 00 03 28 29 56

    常量池9---01 00 04 43 6F 64 65

    常量池10---01 00 0F 4C 69 6E 65 4E 75 6D 62 65 72 54 61 62 6C 65

    常量池11---01 00 04 6D 61 69 6E

    常量池12---01 00 16 28 5B 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 29 56

    常量池13---01 00 0A 53 6F 75 72 63 65 46 69 6C 65

    常量池14---01 00 09 54 65 73 74 2E 6A 61 76 61

       #8 = Utf8               ()V
       #9 = Utf8               Code
      #10 = Utf8               LineNumberTable
      #11 = Utf8               main
      #12 = Utf8               ([Ljava/lang/String;)V
      #13 = Utf8               SourceFile
      #14 = Utf8               Test.java

    常量池15---0C 00 07 00 08

      1,0C---tag为11,类型为CONSTANT_NameAndType,参照jvm官方文档,其结构为

    CONSTANT_NameAndType_info {
        u1 tag;
        u2 name_index;
        u2 descriptor_index;
    }
      2,00 07---该字段或方法名称常量索引值为7,即
    #7 = Utf8               <init>

      3,00 08---该字段或方法描述符常量索引值为8 ,即

    #8 = Utf8               ()V

    常量池16---07 00 17

    常量池17---0C 00 18 00 19

    常量池18---01 00 04 74 65 73 74

    常量池19---07 00 1A

    常量池20---0C 00 1B 00 1C

    常量池21---01 00 04 54 65 73 74

    常量池22---01 00 10 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74

    常量池23---01 00 10 6A 61 76 6A 2F 6C 61 6E 67 2F 53 79 73 74 65 6D

    常量池24---01 00 03 6F 75 74

    常量池25---01 00 15 4C 6A 61 76 61 2F 69 6F 2F 50 72 69 6E 74 53 74 72 65 61 6D 3B

    常量池26---01 00 13 6A 61 76 61 2F 69 6F 2F 50 72 69 6E 74 53 74 72 65 61 6D

    常量池27---01 00 07 70 72 69 6E 74 6C 6E

    常量池28---01 00 15 28 4 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 29 56

      #16 = Class              #23            //  java/lang/System
      #17 = NameAndType        #24:#25        //  out:Ljava/io/PrintStream;
      #18 = Utf8               test
      #19 = Class              #26            //  java/io/PrintStream
      #20 = NameAndType        #27:#28        //  println:(Ljava/lang/String;)V
      #21 = Utf8               Test
      #22 = Utf8               java/lang/Object
      #23 = Utf8               java/lang/System
      #24 = Utf8               out
      #25 = Utf8               Ljava/io/PrintStream;
      #26 = Utf8               java/io/PrintStream
      #27 = Utf8               println
      #28 = Utf8               (Ljava/lang/String;)V

    到此常量池结束

    4、访问标志access_flags

    00 21----Test类的访问标志,参照官方文档,访问标志有

    Flag Name Value Interpretation
    ACC_PUBLIC 0x0001 Declared public; may be accessed from outside its package.
    ACC_FINAL 0x0010 Declared final; no subclasses allowed.
    ACC_SUPER 0x0020 Treat superclass methods specially when invoked by the invokespecial instruction.
    ACC_INTERFACE 0x0200 Is an interface, not a class.
    ACC_ABSTRACT 0x0400 Declared abstract; must not be instantiated.
    ACC_SYNTHETIC 0x1000 Declared synthetic; not present in the source code.
    ACC_ANNOTATION 0x2000 Declared as an annotation type.
    ACC_ENUM 0x4000 Declared as an enum type.

    0x0021 = 0x0020|0x0001,即ACC_PUBLIC和ACC_SUPER为真,ACC_PUBLIC好理解,ACC_SUPER这是什么鬼,翻看官方文档,原文如下:

    The ACC_SUPER flag indicates which of two alternative semantics is to be expressed by the invokespecial instruction (§invokespecial) if it appears in this class. Compilers to the instruction set of the Java Virtual Machine should set the ACC_SUPER flag.

    The ACC_SUPER flag exists for backward compatibility with code compiled by older compilers for the Java programming language. In Oracle’s JDK prior to release 1.0.2, the compiler generated ClassFile access_flags in which the flag now representing ACC_SUPER had no assigned meaning, and Oracle's Java Virtual Machine implementation ignored the flag if it was set.

    为了兼容之前的jdk版本,在jdk1.0.2之后这个编译出来的为真

    5,类索引,父类索引,接口索引

    接下来就是类索引,父类索引,接口索引

    00 05------类索引值为#5 

    #5 = Class              #21            //  Test

    00 06-----父类索引值为#6

    #6 = Class              #22            //  java/lang/Object

    00 00----类没有实现接口,接口数为0,所以后面没有接口信息

    6、字段

    00 00----当前类有0个字段

    7、方法,指令

    00 02----当前类有两个方法,参照官方文档,方法的结构如下:

    method_info {
        u2             access_flags;
        u2             name_index;
        u2             descriptor_index;
        u2             attributes_count;
        attribute_info attributes[attributes_count];
    }
    方法1:00 01 00 07 00 08 00 01 

          ----00 01:access_flags=0x0001=ACC_PUBLIC,方法的访问标志如下表:

    Flag Name Value Interpretation
    ACC_PUBLIC 0x0001 Declared public; may be accessed from outside its package.
    ACC_PRIVATE 0x0002 Declared private; accessible only within the defining class.
    ACC_PROTECTED 0x0004 Declared protected; may be accessed within subclasses.
    ACC_STATIC 0x0008 Declared static.
    ACC_FINAL 0x0010 Declared final; must not be overridden (§5.4.5).
    ACC_SYNCHRONIZED 0x0020 Declared synchronized; invocation is wrapped by a monitor use.
    ACC_BRIDGE 0x0040 A bridge method, generated by the compiler.
    ACC_VARARGS 0x0080 Declared with variable number of arguments.
    ACC_NATIVE 0x0100 Declared native; implemented in a language other than Java.
    ACC_ABSTRACT 0x0400 Declared abstract; no implementation is provided.
    ACC_STRICT 0x0800 Declared strictfp; floating-point mode is FP-strict.
    ACC_SYNTHETIC 0x1000 Declared synthetic; not present in the source code.

       ---00 07:name_index=#7----->#7 = Utf8               <init>,可以看出该方法为构造函数

       ---00 08:descriptor_index=#8------>#8 = Utf8               ()V

       ---00 01:attributes_count=1,所以紧随其后就是attribute_info部分,根据官方文档,其结构如下:

    Code_attribute {
        u2 attribute_name_index;
        u4 attribute_length;
        u2 max_stack;
        u2 max_locals;
        u4 code_length;
        u1 code[code_length];
        u2 exception_table_length;
        {   u2 start_pc;
            u2 end_pc;
            u2 handler_pc;
            u2 catch_type;
        } exception_table[exception_table_length];
        u2 attributes_count;
        attribute_info attributes[attributes_count];
    }
     00 09 00 00 00 1D 00 01 00 01 00 00 00 05   //非指令部分

         ---00 09:attribute_name_index=#9---------->#9 = Utf8               Code

         ---00 00 00 1D:attribute_length=29,所以整个属性表的长度为29+6=35,见官方文档说明:The value of the attribute_length item indicates the length of the attribute, excluding the initial six bytes.

         ---00 01:max_stack=1

         ---00 01:max_locals=1

         ---00 00 00 05:code_length=5

    紧接着就是方法1的指令部分:
    2A B7 00 01 B1

         ---2A:aload_0 ,

         ---B7 00 01 ->invokespecial #1,调用超类构造方法

         ---B1--->return

    方法1的Exception:

    00 00:方法没有throw异常

    方法1的attribute count:

    00 01://方法1最后有一个属性块,其结构如下:

    LineNumberTable_attribute {
        u2 attribute_name_index;
        u4 attribute_length;
        u2 line_number_table_length;
        {   u2 start_pc;
            u2 line_number;	
        } line_number_table[line_number_table_length];
    }
    00 0A 00 00 00 06 00 01

    00 00 00 01

         ---00 0A:attribute_name_index=#10---->#10 = Utf8               LineNumberTable

         ---00 00 00 06:attribute_lenght=6

         ---00 01:line_number_table_length=1,表示这个LineNumberTable中有一条记录

         ---00 00 00 01:表示Test.java的第一行代码对应指令0--->0: aload_0


    方法2:00 09 00 0B 00 0C 00 01

        ---00 09:access_flags=0x0008|0x0001=ACC_STATIC|ACC_PUBLIC

        ---00 0B:name_index=#11------>#11 = Utf8               main

        ---00 0C:descriptor_index=#12----->#12 = Utf8               ([Ljava/lang/String;)V

        ---00 01:arrtibutes_count=1,紧接着是attribute_info

    方法2的code,非指令部分:

    00 09 00 00 00 25 00 02 00 01 00 00 00 09

        ---00 09:attribute_name_index=#9----->#9 = Utf8               Code

        ---00 00 00 25:attribute_length=37,所以整个属性表的长度为43

        ---00 02:max_stack=2

        ---00 01:max_locals=1

        ---00 00 00 09:code_length=17

    方法2的code,指令部分

    B2 00 02----->getstatic #2:获取指定类的静态域,并且压入到栈顶,#2表示#2 = Fieldref           #16.#17        //  java/lang/System.out:Ljava/io/PrintStream;

    12 03--->ldc #3,将“test”常量值从常量池中压入到栈顶

    B6 00 04---->invokervirtual  #4,调用实例方法,#4 = Methodref          #19.#20        //  java/io/PrintStream.println:(Ljava/lang/String;)V,即println方法

    B1---->return


    方法2的Exception:

    00 00 ----->没有定义throw

    方法2的attribute_count:

    00 01 //方法最后有个属性

    方法2的LineNumberTable:

    00 0A 00 00 00 0A 00 02

         ----00 0A:attribute_name_index=#10------>#10 = Utf8               LineNumberTable

         ----00 00 00 0A:attribute_length=10

         ----00 02:line_number_table_lenght=2,表示lineNumberTable中有2条记录

    00 00 00 04:Test.java第4行对应指令0 --->getstatic     #2

    00 08 00 05:Test.java第5行对应指令8----->8: return


    8.sourceFile属性

    00 01:当前class文件包含1个attribute_info

    00 0D 00 00 00 02 00 0E

         ---00 0D:attribute_name_index=#13---->#13 = Utf8               SourceFile

         ---00 00 00 02:attribute_length=2

         ---00 0E:sourcefile_index=#14---->#14 = Utf8               Test.java


    至此,class文件中的内容分析完毕!



    展开全文
  • 1:我们这边是否关机不影响日本那边的程序运行。(不会像以前那样,我们这网络一断开,或一关机,程序就断掉或找不到数据,跑了几天的程序只能重头再来,很是烦恼) 2:不影响计算效率 2:程序在后台跑后,不会

    你是否遇到过这样的情况:从终端软件登录远程的Linux主机,将一堆很大的文件压缩为一个.tar.gz文件,连续压缩了半个小时还没有完成,这时,突然你断网了,你登录不上远程Linux主机了,那么前面的半个小时就会前功尽弃,你非常气愤……

    在Linux下,如果你要执行的shell命令耗时特别长,并且:(1)你的网络不稳定,随时可能断网;或者(2)你在执行了shell命令之后必须要关闭终端软件(例如SecureCRT)。


    那么你就需要以脱离终端的方式在后台运行这个shell命令。

    方法如下:

    (1)输入命令:

    nohup 你的shell命令 &

    (2)回车,使终端回到shell命令行;

    (3)输入exit命令退出终端:exit

    (4)现在可以关闭你的终端软件了,等过足够的时间,让你的shell命令执行完了再上去看结果吧。

    其中,nohup命令可以让你的shell命令忽略SIGHUP信号,即可以使之脱离终端运行;“&”可以让你的命令在后台运行。

    以脱离终端的方式在后台运行shell命令有这样几个好处:只要你执行过了命令,那么你的网络中断不会对你有任何影响,并且你就可以关闭终端软件了。

    

    一、为什么要使程序在后台执行

    我们计算的程序都是周期很长的,通常要几个小时甚至一个星期。我们用的环境是用putty远程连接到日本Linux服务器。所以使程序在后台跑有以下三个好处:

    1:我们这边是否关机不影响日本那边的程序运行。(不会像以前那样,我们这网络一断开,或一关机,程序就断掉或找不到数据,跑了几天的程序只能重头再来,很是烦恼)

    2:不影响计算效率

    2:让程序在后台跑后,不会占据终端,我们可以用终端做别的事情。

    二、怎么样使程序在后台执行

    方法有很多,这里主要列举两种。假如我们有程序pso.cpp,通过编译后产生可执行文件pso,我们要使psolinux服务器后台执行。当客户端关机后重新登入服务器后继续查看本来在终端输出的运行结果。(假设操作都在当前目录下)

    方法1在终端输入命令:

     # ./pso > pso.file 2>&1 & 

    解释:将pso直接放在后台运行,并把终端输出存放在当前目录下的pso.file文件中。

          当客户端关机后重新登陆服务器后,直接查看pso.file文件就可看执行结果(命

    令:#cat pso.file)。

      

    方法2在终端输入命令:

    # nohup  ./pso > pso.file 2>&1 &

    解释:nohup就是不挂起的意思,将pso直接放在后台运行,并把终端输出存放在当前

    目录下的pso.file文件中。当客户端关机后重新登陆服务器后,直接查看pso.file

    文件就可看执行结果(命令:#cat pso.file)。

    三、常用任务管理命令

    # jobs      //查看任务,返回任务编号n和进程号

    # bg  %n   //将编号为n的任务转后台运行

    # fg  %n   //将编号为n的任务转前台运行

    # ctrl+z    //挂起当前任务

    # ctrl+c    //结束当前任务

     

    注:如果要使在前天执行任务放到后台运行,则先要用ctrl+z挂起该任务,然后用bg使之后台执行。

     

    附:

     

    在Linux中,如果要让进程在后台运行,一般情况下,我们在命令后面加上&即可,实际上,这样是将命令放入到一个作业队列中了:

    $ ./test.sh & 
    [1] 17208  
    $ jobs -l 
    [1]+ 17208 Running                 ./test.sh & 

    对于已经在前台执行的命令,也可以重新放到后台执行,首先按ctrl+z暂停已经运行的进程,然后使用bg命令将停止的作业放到后台运行:

    $ ./test.sh 
    [1]+  Stopped                 ./test.sh  
    $ bg %1 [1]+ ./test.sh &  
    $ jobs -l 
    [1]+ 22794 Running                 ./test.sh & 

     

    但是如上方到后台执行的进程,其父进程还是当前终端shell的进程,而一旦父进程退出,则会发送hangup信号给所有子进程,子进程收到hangup以后也会退出。如果我们要在退出shell的时候继续运行进程,则需要使用nohup忽略hangup信号,或者setsid将将父进程设为init进程(进程号为1)

    $ echo $$ 
    21734  
    $ nohup ./test.sh & 
    [1] 29016  
    $ ps -ef | grep test 
    515      29710 21734  0 11:47 pts/12   00:00:00 /bin/sh ./test.sh 
    515      29713 21734  0 11:47 pts/12   00:00:00 grep test 
    $ setsid ./test.sh & 
    [1] 409  
    $ ps -ef | grep test 
    515        410     1  0 11:49 ?        00:00:00 /bin/sh ./test.sh 
    515        413 21734  0 11:49 pts/12   00:00:00 grep test 

    上面的试验演示了使用nohup/setsid加上&使进程在后台运行,同时不受当前shell退出的影响。那么对于已经在后台运行的进程,该怎么办呢?可以使用disown命令:

    $ ./test.sh & 
    [1] 2539  
    $ jobs -l 
    [1]+  2539 Running                 ./test.sh &  
    $ disown -h %1  
    $ ps -ef | grep test 
    515        410     1  0 11:49 ?        00:00:00 /bin/sh ./test.sh 
    515       2542 21734  0 11:52 pts/12   00:00:00 grep test 

    另外还有一种方法,即使将进程在一个subshell中执行,其实这和setsid异曲同工。方法很简单,将命令用括号() 括起来即可:

    $ (./test.sh &)  
    $ ps -ef | grep test 
    515        410     1  0 11:49 ?        00:00:00 /bin/sh ./test.sh 
    515      12483 21734  0 11:59 pts/12   00:00:00 grep test 

    注:本文试验环境为Red Hat Enterprise Linux AS release 4 (Nahant Update 5),shell为/bin/bash,不同的OS和shell可能命令有些不一样。例如AIX的ksh,没有disown,但是可以使用nohup -pPID来获得disown同样的效果。

    还有一种更加强大的方式是使用screen,首先创建一个断开模式的虚拟终端,然后用-r选项重新连接这个虚拟终端,在其中执行的任何命令,都能达到nohup的效果,这在有多个命令需要在后台连续执行的时候比较方便:

    $ screen -dmS screen_test  
    $ screen -list There is a screen on:
                  27963.screen_test       (Detached) 1 Socket in /tmp/uscreens/S-jiangfeng.  
    $ screen -r screen_test 
    
    展开全文
  • Qt程序写好了,想打包成.exe可执行文件,别人的电脑也能直接运行起来,很简单。 找到Qt的自带工具: 打开它: 1.dir 2. cd bin 3.dir *deploy* 4.windeployqt.exe C:\...\...\.....--------------------...
  • 一个java程序是怎样运行起来的(3)

    万次阅读 2017-11-30 22:36:09
    一个java程序是怎样执行的
  • 程序是如何运行

    千次阅读 2018-11-22 12:33:18
    对于任何一个学习过C语言的来说,“HelloWorld”程序都不会陌生。因为它应该是你打开新...但是你们知道短短的几行代码,是怎么让程序运行起来的么? // hello.c #include &lt;stdio.h&gt; int main(int a...
  • Java程序运行机制及其运行过程

    万次阅读 多人点赞 2018-07-31 13:34:46
    本文主要讲的是jvm运行java程序。 (一)终端中如何运行一个java程序(这个是我在mac下运行的,windows下原理是一样的,大同小异) 做这个事情的前提下,一定是jdk已经安装好了并且没任何问题。 首先要想运行java...
  • Win知识 - 程序是怎样跑起来的(合集)

    万次阅读 多人点赞 2019-01-07 10:33:32
    操作系统的硬件控制功能...在前面的程序中用到了time()及printf()等函数,这些函数内部也都使用了系统调用。这里之所以用“内部”这个词,是因为在Windows操作系统中,提供返回当前日期和时刻,以及在显示器中显示字...
  • 一、为什么要使程序在后台执行 我们计算的程序都是周期很长的,通常要几个小时甚至一个星期。我们用的环境是用putty远程连接到日本Linux服务器。...1:我们这边是否关机不影响日本那边的程序运行。(不会像以前那
  • Java初学者用记事本写的程序用cmd运行起来,能翻译成class但是就是输出不了,但是用eclipse可以T_TT_T
  • 一个程序在计算机中到底是如何运行的?

    万次阅读 多人点赞 2016-09-22 23:46:09
    在《载入内存,让程序运行起来》一节中讲到,程序是保存在硬盘中的,要载入内存才能运行,CPU也被设计为只能从内存中读取数据和指令。 对于CPU来说,内存仅仅是一个存放指令和数据的地方,并不能在内存中完成计算...
  • 1.程序运行必要的硬件 1.必须有一个存储器,记忆程序和数据的存储器。 2.必须有一个控制器,控制程序执行的控制器。 3.必须有一个运算器,完成数据加工处理的运算器。 4.必须有输入设备和输出设备,用于进行...
  • 1. 概念初步 程序:计算机的程序,和做饭、运动会的程序一样,指的是“做事的先后次序”; 程序的组成:程序是指令(及物动词)和数据(宾语)的组合体; C 语言 printf("hello\n");...正在运行程序存储
  • 如何运行一个nodejs 程序

    千次阅读 2019-09-04 20:11:27
    如何运行一个nodejs 程序 在Windows环境中运行NodeJS程序, 1.将代码文件保存到NodeJS安装文件的根目录,运行文件的时候, 2.需要打开cmd,然后输入NodeJS的安装盘名称, ...即可将程序运行起来。 ...
  • 使用Linux系统时经常需要监控程序运行情况,比如最近我遇到了一个情况就是一个控制程序偶尔会在运行中退出,在这种情况下我需要立即重启该程序。最后在谢枫同学的帮助下完成了重启脚本。 目前遇见了两种可能的情况...
  • 使用nohup让程序在服务器后台运行

    千次阅读 2018-08-15 20:57:33
    linux下通常部署完程序,需要它一直在后台运行,否则ssh一旦断开,整个进程就挂了。今天要介绍的就是一个关于让程序在后台运行的命令nohup!!! 网上的许多文章对于nohup这个命令有非常细致的讲解,然而我认为在...
  • 如何运行NodeJS程序

    千次阅读 2016-06-30 17:27:58
    在Windows环境中运行nodejs程序,在保存好代码文件后,需要打开cmd,然后输入node 文件名.js点击回车键,即可将程序运行起来
  • 单片机程序运行在哪里

    千次阅读 2018-10-12 19:02:29
    我们程序运行其实是由多种方式的,不过一般常见的有两种。 运行在ROM里的和运行在RAM里的。 一般比较小的系统,也就是说,单片机本身内部就有FLASH的。这种FLASH不同于通用的FLASH,他是支持随机地址访问...
  • 使用Mono.NET程序跨平台运行

    万次阅读 2016-05-03 14:49:39
    传统的针对不同平台进行开发的方式常常开发者顾此失彼,难以保证应用程序在不同的平台都有着相同的、出色的体验,这种情况下寻找到一种跨平台开发的方式将会为解决这个问题找到一种思路。从目前的开发环境来看,...
  • 使用screen让程序在关闭xshell后仍可以正常运行 及一些常用的命令
  • c程序运行原理简介

    千次阅读 2013-12-29 13:25:10
    本文从一个最简单C程序(hello)是如何被编译和链接讲起,描述了一个程序运行的原理。 一、程序运行之前 使用IDE(集成开发环境)的朋友们经常会有这样的疑问:代码是怎么从一个文本文件变成可执行程序的呢?代码...
  • java程序运行过程解析

    千次阅读 2012-08-23 11:16:16
    这里的java程序运行过程,是指我们编译好代码之后,在命令行开始执行java xxx命令,到java程序开始执行起来的这一过程,我们称其为运行时。  第一步,操作系统解析我们输入的java xxx命令,根据PATH中所配置的jrd...
  • 运行了一个python程序。常规做法是 python3 demo.py 然后程序起来了。当我们把终端关闭的时候。发现程序也跟着挂掉了。 解决办法: 使用命令 nohuppython3 demo.py & 命令就可以了。。 多了 一个 nohup 和...
  • 使用 Visual Studio Code 运行 Java 程序

    万次阅读 2019-04-28 13:11:22
    1. 使用 Visual Studio Code 运行 C# 及 Java 程序 使用 Visual Studio Code 运行 C# 及 Java 程序 Visual Studio Code 搭建 Java 开发环境 【VSCode】Windows下VSCode编译运行简单java 整理:使用 Visual Studio ...
  • 回到系列文章的目录——[系列文章目录]1.2 让程序“跑”起来 把程序写在纸上,有思考,有实践,这种方式可以有。 把程序输入到计算机,计算机“跑”程序,这种方式最直观。这也是让程序工作的方式。 学习编程序...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,294,511
精华内容 517,804
关键字:

如何让程序运行起来