首页 > 系统相关 >java 调用gcc 和lldb 等shell程序的方法

java 调用gcc 和lldb 等shell程序的方法

时间:2022-11-29 19:57:50浏览次数:46  
标签:gcc shell java String caller return new public

java 调用gcc 和lldb 等shell程序的方法,我这里是调用的是gcc 的objdump工具 用于生成汇编代码

直接调用控制台程序会出现死锁的问题,java特色,所以封装一下

封装

package com.far.vms.opencar.utils;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.function.Function;

/*
 * @description:
 *
 * 调用操作系统的Shell 需要兼容mac linux win
 *
 * @author mike/Fang.J
 * @data 2022/11/29
 */
public class ShellUtil {


    public static class RunShellThread implements Runnable {

        private InputStream inputStream;

        private Function<String, Integer> caller;

        public Function<String, Integer> getCaller() {
            return caller;
        }

        public RunShellThread setCaller(Function<String, Integer> caller) {
            this.caller = caller;
            return this;
        }

        public InputStream getInputStream() {
            return inputStream;
        }

        public RunShellThread setInputStream(InputStream inputStream) {
            this.inputStream = inputStream;
            return this;
        }

        @Override
        public void run() {

            InputStreamReader inputStreamReader = null;
            BufferedReader br = null;
            try {
                inputStreamReader = new InputStreamReader(inputStream);
                br = new BufferedReader(inputStreamReader);
                // 打印信息
                String line = null;
                while ((line = br.readLine()) != null) {
                    caller.apply(line);
                    //System.out.println(line);
                }
            } catch (IOException ioe) {
                ioe.printStackTrace();
            } finally {
                try {
                    br.close();
                    inputStreamReader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }


    /**
     * @param shellProgPath
     * @param args
     * @param caller
     * @description:
     * @return: void
     * @author mike/Fang.J
     * @data 2022/11/29
     */
    public static void runShell(String shellProgPath, String[] args, Function<String, Integer> caller) {

        try {
            Process p = Runtime.getRuntime().exec(args);
            //caller没有考虑线程安全
            new Thread(new RunShellThread().setCaller(caller).setInputStream(p.getInputStream())).start();
            new Thread(new RunShellThread().setCaller(caller).setInputStream(p.getErrorStream())).start();
            p.waitFor();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}

调用

   String kr = "D:\\AAAA_WORK\\RISC-V-Tools\\os\\riscv-operating-system-mooc\\code\\os\\01-helloRVOS\\build\\kernel-img.img";
        String buildTool = "D:\\AAAA_WORK\\RISC-V-Tools\\riscv64-unknown-elf-toolchain-10.2.0-2020.12.8-x86_64-w64-mingw32\\bin\\riscv64-unknown-elf-objdump.exe";

        ShellUtil.runShell(buildTool, new String[]{buildTool,kr ,"-d"}, cmdInf -> {
            System.out.println(cmdInf);
            return 0;
        });

标签:gcc,shell,java,String,caller,return,new,public
From: https://www.cnblogs.com/cfas/p/16936503.html

相关文章

  • 教你用JavaScript实现随机点名
    案例介绍欢迎来到我的小院,我是霍大侠,恭喜你今天又要进步一点点了!我们来用JavaScript相关知识,做一个随机点名的案例。你可以通过点击开始按钮控制上方名字的闪动,点击停止......
  • Java8新特性之Stream流详细总结
    目录​​一:什么是Stream​​​​1.1简介​​​​1.2StreamAPI的特点:​​​​二 Stream流的创建​​​​2.1通过Collection接口函数​​​​2.2 通过Stream​​​​2......
  • java泛型小结
    一.泛型出现的需求首先,我们看下下面这段简短的代码: 1publicclassTest{ 2 3    publicstaticvoidmain(String[]args){ 4        Listlist=n......
  • 再看Java之温故知新(体系篇)
    全手打总结不易,转载请标明出处。目录​​一数据类型​​​​1.18种基本数据类型​​​​1.2引用数据类型​​​​1.3java内存机制 ​​​​1.3.1 寄存器​​​​1.3.2......
  • Java内功修炼系列:代理模式及动态代理
    目录​​一代理模式​​​​1.1简介​​​​1.2代理模式角色定义​​​​二静态代理​​​​2.1介绍和实例​​​​2.2静态代理的缺点​​​​三动态代理​​​​3.1......
  • Android Error: java.lang.IllegalArgumentException: You cannot start a load for a
    一:Glide有时会出现这样的异常:java.lang.IllegalArgumentException:Youcannotstartaloadforadestroyedactivityatcom.bumptech.glide.manager.RequestManagerRe......
  • 2022-11-29Java学习
    1.面向对象的三大特征:封装,继承,多态。 2.staticstatic:静态修饰符,用于修饰成员变量和成员函数特点:(1)要共享这个对象,用static修饰;(2)被static修饰的成员可以直接被类名调......
  • java多线程模型
    一、线程状态:  新建状态(New):新创建了一个线程对象。就绪状态(可执行状态,Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,......
  • 力扣240(java&python)-搜索二维矩阵 II(中等)
    题目:编写一个高效的算法来搜索 m x n 矩阵matrix中的一个目标值target。该矩阵具有以下特性:每行的元素从左到右升序排列。每列的元素从上到下升序排列。 示例......
  • javascript 高级编程系列 - 字符串
    1.字符串中的方法matchstr.match(reg)参数:一个正则表达式对象,如果reg不是正则表达式对象,则会利用newRegExp(reg)隐式转换。返回值:1.正则表达式中如果有g标志......