java - 从 Java 与 C 可执行文件通信

标签 java c

我有一个 C 可执行文件,可以从 CYGWIN 运行它。我也想从 JAVA 运行相同的文件。 C 程序通过 stdin 和 stdout 获取输入和输出。主要是获取字符串并输出字符串。

我想我可以使用进程构建器成功启动程序。但是我无法与 C 程序交互。为了启动 .exe,我使用 ProcessBuilder,请参阅下文。

Process cmd = new ProcessBuilder("path to exe").start();

我的C程序的主要方法在这里:

int main(argc, argv)
{
/* set command line or config file parms */
config(argc, argv);
/* read grammar, initialize parser, malloc space, etc */
init_parse(dir, dict_file, grammar_file, frames_file, priority_file);
/* for each utterance */
while( fgets(line, LINE_LEN-1, fp) ) {
/* assign word strings to slots in frames */
parse(line, gram);
/* print parses to buffer */
for(i= 0; i < num_parses; i++ )
print_parse(i, out_ptr, extract, gram);
/* clear parser temps */
reset(num_nets);
}
}

我的目标是发送输入并从 Java 获取输出。

最佳答案

如果您只需要 stdinput/output,那么您可以使用 ProcessBuilder 获取适当的流。或某种形式的System.exec很容易。

之后,只需生成输出并解析输入但是要小心。输入流和输出流通常应该在不同的线程中处理。否则很容易陷入死锁,因为大多数程序不会期望 stdin 和 stdout 绑定(bind)到单个进程(例如,当您仍在尝试写入 stdin 流时,stdout 会填充您的输入缓冲区。您的写入是阻塞等待程序读取更多内容,但它不会,因为它的写入被阻塞等待您读取更多内容。经典。)

小心线程,但玩得开心!

关于java - 从 Java 与 C 可执行文件通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17245354/

相关文章:

java - 我如何使用按钮更改 javafx 中的图像

c - 发现 IP 地址是 DHCP 还是静态

python - 自动化 vi/nano 编辑器进行 git commit --amend

java - 使用 Java 在 Google Compute Engine 上进行批处理

java - 从正在运行的java程序中获取CPU编号

java - 找不到 mail.jar,Netbeans

c - 解释器中的函数指针

cmake 在 clang try_compile 中使用 Windows 样式标志失败

c - C 中的 Malloc 断言失败

java - Hive 元存储遭受 kerberos "Clock skew too great"错误