前面几篇文章我们对我们分别对JavaIOtixi 及在学习IO过程中需要用到的基础知识做了一些讲解,有兴趣的可以看往期的几篇文章。

全图(下面有分解图)

java linux mv 调用 java调用linux内核_java linux mv 调用

图解:

java linux mv 调用 java调用linux内核_java linux mv 调用_02

释义:

java linux mv 调用 java调用linux内核_java_03

1.Linux中可以使用strace命令抓取程序运行时对系统的调用,不只抓取JAVA,任何Linux中程序都可以抓取。

strace -ff -o ./ooxx java TestSocket.java

2.使用以上命令会当前目录生成一堆线程所需文件,ooxx.***文件后缀为线程ID号

3.使用grep命令,查看当面目录哪个文件中存在指定的字符串。找到存在对应字符串的文件,就知道了文件所存在的线程,例如为ooxx.2879 。文件列表还有其他文件,其中ooxx.2879最大,则该文件可能为 JAVA主方法(main)所在主线程的文件。
grep ‘StartServerSocket8090’ ./
*
4.使用 vim 命令查看 ooxx.2879 文件,/StartServer命令 搜索文件中指定字符串‘StartServer’存在的位置。

vim ooxx.2879

5.使用JDK自带的jps 命令可以知道所运行程序代码所在的进程ID号为2878.即所存在的文件为

ooxx.2878。
jps 打印 2878 TestSocket

6.linux系统中一切皆文件,使用 ‘/proc/进程ID号’命令,可以查看进程在系统中的文件夹。Linux系统把程序中的变量,属性,线程等以文件的形式展示到进程ID号所对应的文件系统中。

/proc/2878
  1. 进程ID号下有两个目录比较重要 分别为task和fd。
    task目录为文件夹下为当前2878JDK进程中的所有线程数量和线程号;
    fd目录为当前进程进行操作时候的流描述。每个流上存在文件描述符,任何一个程序都存在IO,且至少存在三个IO操作(0、1、2)
    文件操作描述符: 0:标准输入(System.in);1:标准输出(System.out);2:错误输出(System.error);3:JVM启动时必须的JAR包库;4、5:为Socket的IO通信,分别为IPV4和IPV6。
    以数字的方式代表流操作,0、1、2、3等。JAVA中也存在对变量修饰符使用数字替代的概念。
    例如: 默认修饰符的结果值是0 , public 修饰符的结果值 是1 ,private 修饰符的结果值是 2 ,protected 修饰符的结果值是 4,static 修饰符的结果值是 8 ,final 修饰符的结果值是 16。 如果是 public static final 三个修饰的 就是3 个的加和 为 25 。

8.使用netstat -natp 命令查看网络状态的使用情况,并打印所有TCP协议号,ID号,进程号等。只有服务端存在LISTEN(监听)状态。

netstat -natp

9.使用nc 命令可以模拟对端口进行网络请求。nc localhost 8090

10.使用nc命令与socket 的8090端口建立连接后,原来2878进程的网络状态变为ESTABLISHED(连通)状态。同时与nc命令产生的随机端口号58181建立连接。使用第8步的netstat命令可以查看。同时,第7步的fd目录下也新增了一个socket的文件描述符6。

11.查看第4步确定ooxx.2879代码,可以查看对应的系统调用代码。 Vim ooxx.2879。/ClientSocket 搜索对应的打印。
vim中的搜索命令 */socket.5$ 以socket开头中间省略,以5结尾的字符串。

12.linux中存在命令 man 可以查看系统调用方法的解释。例如 :man accept 返回的accept(2),其中2代表cpu指令集中系统调用的指令集权限代码为2man socket 、man 2 bind、man listen、man poll、man accept,其中命令中携带2表示要查看系统调用级别的方法。
13.JAVA语言是解释型语言。通过JVM把.java文件编译为.class字节码文件。JAVA最值钱的为JVM的编译器,可以编译成二进制代码,然后再让CPU去执行。jvm虚拟机、class—解释型语言、编译–解释成操作系统OS的方法 、syscall。

14.JAVA语言、PHP语言包括其他语言的所有代码都会最终调用操作系统提供的方法,然后再执行。