另一个控制台应用程序中的C-Run控制台应用程序

时间:2017-09-08 01:21:37

标签: c

我需要构建一个控制台应用程序(A),它显示一个菜单,您可以在其中选择一个选项,它将执行我在课堂上构建的以前的控制台应用程序(B,C,D ......)。我怎么能这样做?我可以调用这些以前的应用程序,还是我需要将它们添加到我的程序中?因为它需要包含大约15个以前的项目,我认为这有点过分。我知道fOpen()用于打开txt文件,我不知道它是否适用于应用程序。 FILE *fopen( const char * filename, const char * mode );

2 个答案:

答案 0 :(得分:0)

您需要启动子进程,然后将<{1}}重定向到您自己的进程输出,并将stdout重定向到您自己的进程输入 - 但可能是你会想拦截某些击键,以允许用户终止子进程而不会杀死你自己的进程。

在POSIX环境中,您将使用stdin,它为您提供了重定向输入和输出的管道。在Windows上,您将使用popen()代替。 Windows没有实现POSIX CreatePipe,但它确实有一个内部函数popen()但我知道它有不同的语义。

但是C标准库中没有任何功能或功能可以在进程之间进行管道传输(C本身甚至不需要计算机支持“进程”的概念 - 它是一个令人惊讶的平台无关的语言和库 - 您甚至可以将其用于没有_popen实现的平台。

无论如何,如果你只针对Windows,或者编写包装库,我建议你阅读这篇MSDN文章,其中描述完全你想要做什么:

https://msdn.microsoft.com/en-us/library/windows/desktop/ms682499(v=vs.85).aspx

  

使用重定向输入和输出创建子进程

     

本主题中的示例演示如何使用控制台进程中的CreateProcess函数创建子进程。它还演示了一种使用匿名管道重定向子进程的标准输入和输出句柄的技术。请注意,命名管道也可用于重定向进程I / O.

答案 1 :(得分:0)

您可以使用功能系统和路径程序 例如:

    public class MainActivity extends AppCompatActivity implements SensorEventListener {
private SensorManager senSensorManager;
private Sensor senAccelerometer;
private float last_x, last_y, last_z;
private static final int shakeThreshold = 1500;
private long lastUpdate = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    senSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
    senAccelerometer = senSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
    senSensorManager.registerListener(this,senAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);

}
@Override
public void onSensorChanged(SensorEvent sensorEvent) {
    Sensor sensor = sensorEvent.sensor;

    if(sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
        float x = sensorEvent.values[0];
        float y = sensorEvent.values[1];
        float z = sensorEvent.values[2];

        long currentTime = System.currentTimeMillis();
        if((currentTime - lastUpdate) > 100) {
            long diffTime = (currentTime - lastUpdate);
            lastUpdate = currentTime;

            float speed = Math.abs(x + y + z - last_x - last_y - last_z)/diffTime * 10000;

            if(speed > shakeThreshold) {
                //start timer here
            }
            last_x = x;
            last_y = y;
            last_z = z;
        }
    }
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {

}
/*protected void onPause() {
    super.onPause();
    senSensorManager.unregisterListener(this);
}
protected void onResume() {
    super.onResume();
    senSensorManager.registerListener(this,senAccelerometer,SensorManager.SENSOR_DELAY_NORMAL);
}*/

system()是一个shell脚本方法,所以你可以按照你想要的任何方式使用它,但是人们说使用系统功能是件坏事,但在你的情况下我没有看到问题。