gpt4 book ai didi

java - 使用 stdin 和 stdout 使用 Java 与外部 C 程序通信

转载 作者:行者123 更新时间:2023-11-30 05:57:41 26 4
gpt4 key购买 nike

我要做的是在 Java 应用程序中启动 C 程序可执行文件,并允许它们使用标准输入和标准输出相互通信。 C 程序将等待来自 java 应用程序的命令并将其回显。我已经用“gnugo --mode gtp”测试了 java 代码(gnugo 在 gtp 模式下与 stdin 和 stdout 通信)并且它工作正常但我的 C 代码不起作用。任何建议将不胜感激。

C代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void) {

unsigned int byte_read;
char *string, *tok;
int cmd_id;

int len = 64;
string = (char *) malloc(len + 1);

while (1) {

byte_read = getline(&string,&byte_read, stdin);

if (byte_read == -1) {
printf("Error reading input\n");

free(string);
exit(0);
//
} else {
printf("Got command: %s\n", string);
}
}
return EXIT_SUCCESS;
}

Java代码

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;

public class Test {

private BlockingQueue<String> m_queue;
private PrintWriter print_out;
private BufferedReader bufIn;
private InputThread inputThread;
private PrintWriter printOut;
private Process p;
public static void main(String[] args) {

Test test = new Test();
test.start();
}

public void start(){

try
{
Runtime rt = Runtime.getRuntime() ;

p = rt.exec("path/to/the/c/program") ;
InputStream in = p.getInputStream() ;
OutputStream out = p.getOutputStream ();
InputStream err = p.getErrorStream();

printOut = new PrintWriter(out);

m_queue = new ArrayBlockingQueue<String>(10);
inputThread = new InputThread(in, m_queue);
inputThread.start();

//send a command to
printOut.println("sample command");
printOut.flush();

//p.destroy() ;
}catch(Exception exc){
System.out.println("Err " + exc.getMessage());
}
}

private void mainLoop(){
String line;
while (true){

try
{
System.out.println("Before");
line = bufIn.readLine();
System.out.println("After");

if (line != null)
System.out.println(line);


}
catch (IOException e)
{
System.out.println("Error readline " + e.getMessage());
return;
}
}
}
private class InputThread extends Thread
{
InputThread(InputStream in, BlockingQueue<String> queue)
{
bufIn = new BufferedReader(new InputStreamReader(in));
m_queue = queue;
}
public void run()
{
try
{
mainLoop();
}
catch (Throwable t)
{

}
}
}

最佳答案

尝试在退出前刷新标准输出,这可能会更好。或者至少更详细地解释发生了什么。

关于java - 使用 stdin 和 stdout 使用 Java 与外部 C 程序通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5287043/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com