停止c程序启动另一个程序

时间:2014-02-08 14:14:29

标签: java c bash

我正在做一个项目,我需要编译一个C程序,在测试数据上运行它,然后生成它的输出。我使用两个bash脚本,第一个clearscript.sh从当前目录(code.c,输入,输出)中删除temprory文件,myscript.sh编译code.c,在输入文件上运行它并生成我显示的输出在我的GUI文本区域。

现在我的问题是,如何阻止用户执行诸如执行系统(“rm *”)之类的事情,因为这会做很糟糕的事情。一种方法是我可以搜索对应于系统命令的字符串,如果找到,那么我将不允许程序运行。但我觉得必须有一个更好的解决方案来停止通过C程序执行外部程序。

另一个问题是当程序运行无限循环时程序停止响应。而且我觉得还有很多问题我将在后面发现。是否有更好的方法来完成我的程序正在做的事情。

    import java.awt.*;
    import javax.swing.*;
    import java.io.*;
    import java.awt.event.*;



    class test2 {

    static         JTextArea ta1,ta2,ta0;

    public static class myEvent implements ActionListener

      {

             public void actionPerformed(ActionEvent e)

                    { 

                            try{

                                    Process p = new ProcessBuilder("./cleanscript.sh").start();
                                    p.waitFor();
                                    }
                            catch(Exception e1)
                                    {}                                

                            try{

                                    BufferedWriter bw = new BufferedWriter(new FileWriter("code.c"));
                                    ta1.write(bw);
                               }
                            catch (IOException ioe)
                            {        
                                    ioe.printStackTrace();
                            }



                            try{
                                    BufferedWriter bw = new BufferedWriter(new FileWriter("input"));
                                    ta0.write(bw);
                            }
                            catch(IOException ioe)
                            {
                                    ioe.printStackTrace();
                            }





                            try{
                            Process pb = new ProcessBuilder("./myscript.sh").start();
                            pb.waitFor();
                            }
                            catch(Exception t)
                                    {}




                            try {

                                    ta2.read(new FileReader(new File("output")),"fun");
                            }
                            catch (IOException ioe2)
                            {
                                    ioe2.printStackTrace();
                            }



                      }
    }




    public static void main(String args[]) {

    JFrame jf;



    jf = new JFrame();


    jf.setLocationByPlatform(true);

    ta0 = new JTextArea("Give Input to the program here,before running the program");
    ta1 = new JTextArea("Your C program here",0,100);
    ta2 = new JTextArea("Your output will be shown here");

    ta2.setEditable(false);




    JScrollPane jsp0,jsp1,jsp2;


    jsp0 = new JScrollPane(ta0);
    jsp1 = new JScrollPane(ta1);
    jsp2 = new JScrollPane(ta2);




    jf.getContentPane().setLayout(new GridLayout(4,1));

    jf.getContentPane().add(jsp1);
    jf.getContentPane().add(jsp0);
    jf.getContentPane().add(jsp2);



    JButton jb = new JButton("Run");

    jb.addActionListener(new myEvent());


    jf.getContentPane().add(jb);



    jf.setSize(1000,400);
    jf.setVisible(true);
    jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }}

cleanscript.sh的代码

     rm code.c
     rm input
     rm output

myscript.sh的代码

     cc code.c
     ./a.out < input > output

1 个答案:

答案 0 :(得分:2)

如果您需要运行某些外部程序,请设置允许的程序列表,并检查列表中的内容。 不要使用system(3),它调用shell来运行命令(这很容易傻瓜),使用exec(3)系列之一。有关安全性的注意事项的更多细节是here