如何将执行命令从bash脚本转换为C?或者如何在“W”模式下正确使用popen()?

时间:2011-02-09 18:36:05

标签: c bash popen execution hang

嘿所有人。我正在尝试将一个执行程序(称为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"你可以像处理用户输入那样处理返回的流,所以我很困惑。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

您可能还想在fprintf()

之后调用fflush()