如何将bash脚本中的执行命令翻译成C语言?或如何在“W”中正确使用 popen()模式?

发布于 2024-10-16 09:24:29 字数 919 浏览 4 评论 0原文

嘿大家。我正在尝试将一个执行程序(称为 pdb2gmx)的简单 bash 脚本转换为 C 命令,以便我可以将其作为函数包含在一个更大的程序中,但我在实现它时遇到了一些麻烦。

bash 脚本:

#!/bin/sh
/usr/local/gromacs/bin/pdb2gmx -f ${1}.pdb -o ${1}.gro -p ${1}.top << EOF
14
6

所以,当运行程序时,它会停止并在两个不同的点(一个紧接另一个点)要求用户输入。在 bash 脚本中,只需输入 14 和 6 似乎就可以满足输入要求,但我似乎无法在 C 中实现相同的技巧(另外,我不太确定 EOF 在那里做什么,我'我只是按照别人的例子,如果没有它,脚本将无法工作)。

这是我到目前为止在 C: 中所拥有的,

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

int main() {
    FILE * pdb2gmx;
    pdb2gmx = popen( "pdb2gmx -f 1BEO.pdb -o 1BEO.gro -p 1BEO.top" , "w" );
    fprintf( pdb2gmx, "EOF" );
    fprintf( pdb2gmx, "14" );
    fprintf( pdb2gmx, "6" );
    pclose( pdb2gmx );
}

但是当执行此代码时,pdb2gmx 只是挂在需要用户输入的第一个点处。那么我错过了什么?

我的感觉是,C 程序本身也挂在 popen 行的执行上,并且永远不会到达 fprintf 行,但我认为使用 popen 模式设置为 "w" 您可以将返回的流视为用户输入,所以我很困惑。

Hey all. I'm trying to translate a simple bash script that executes a program (called pdb2gmx) into C commands so I can include it as a function in a much larger program, but I'm having some trouble making it happen.

The bash script:

#!/bin/sh
/usr/local/gromacs/bin/pdb2gmx -f ${1}.pdb -o ${1}.gro -p ${1}.top << EOF
14
6

So what's going is that when running the program, it stops and asks for user input at two separate points, one right after the other. In the bash script, just putting down 14 and 6 seems to fulfill the input requirement, but I can't seem to pull off the same trick in C (also, I'm not really sure what the EOF is doing there, I'm just following someone else's example with that, and the script won't work without it).

This is what I have so far in C:

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

int main() {
    FILE * pdb2gmx;
    pdb2gmx = popen( "pdb2gmx -f 1BEO.pdb -o 1BEO.gro -p 1BEO.top" , "w" );
    fprintf( pdb2gmx, "EOF" );
    fprintf( pdb2gmx, "14" );
    fprintf( pdb2gmx, "6" );
    pclose( pdb2gmx );
}

but when this code is executed pdb2gmx just hangs at the first point where it needs user input. So what am I missing?

My sense is that the C program itself is also hanging on the execution of the popen line, and never getting to the fprintf lines, but I thought that with popen mode set to "w" you could just treat the returned stream like user input, so I'm pretty confused.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

清音悠歌 2024-10-23 09:24:30

您可能需要在这些 fprintf 字符串的末尾添加一些换行符 (\n)...

You probably need to add some newlines (\n) to the end of those fprintf strings...

千里故人稀 2024-10-23 09:24:30

您是否检查过pdb2gmx的值 - 您是否正确设置了路径以便您的程序找到pdb2gmx可执行文件?

您可能还想在 fprintf() 之后调用 fflush()

have you checked the value of pdb2gmx - do you have the path set correctly so that your program finds the pdb2gmx executable?

You might also want to call fflush() after the fprintf()

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文