C和Unix环境之间的异步通信

时间:2015-11-11 03:27:04

标签: c unix asynchronous

该计划: 我的程序的目标是利用另一个程序来执行其计算。问题是异步与该程序通信。以下是我用于调用其他程序的代码的一部分。这是通过分布式计算的脚本完成的。

while(c < Images)
{
    system(CommandArray[c]);
    k = chdir(ImageArray[c]);
    if(k != 0)
    {
        printf("Directory Change Failed!");
    }
    else
    {
        system("qsub SubScript.sh");
        printf("Job Submitted for Image: %d \n",c+1);
        sleep(1);
    }
    c++;
    k = chdir("../");
}
c = 0;
printf("Starting 'Checking' Script");
system("./CheckingScript.sh 3");

变量的含义:

  • ImageArray [c]:包含子目录的名称(Image_1,Image_2等)
  • SubScript.sh:这是用于将该程序的其余部分生成的文件(代码未显示)提交给服务器的头节点并将其他节目发送给其他节点执行的脚本
  • CheckingScript.sh:一个简单的脚本,用于检查SubScript生成的“Status”文件是否存在。如果该文件存在,则脚本将在该目录中等待,直到该文件不再存在。然后移动到下一个目录。这是为了判断该工作是否已由其他计划完成。

问题:无论我做什么,我都无法让C程序等待结果返回而不会导致其他程序突然被清空的那些目录(文件)都还在那里,但他们的内容被删除)。我已经尝试直接从C程序检查目录,但这会导致上述问题。所以作为最后的手段,我试图编写一个脚本来检查我。它的工作原理! (好吧不是真的...)我可以使用命令行中的脚本,它按预期工作,但是当我通过system()提交它时,它不会回显任何内置语句以显示它正在运行。这意味着system()执行然后程序结束而不从其应该等待的其他程序中收集结果。

感谢您阅读本文,我非常感谢您的帮助!我知道system()命令有点暴躁,所以任何有关替代选项的建议都将受到高度赞赏。有关我的计划的更多信息,请参阅我的博客:Link to Blog

1 个答案:

答案 0 :(得分:0)

好吧,我猜函数popen()可以帮助你收集结果。 函数popen()执行命令并在调用程序和执行的命令之间连接管道。我建议您参考函数的手册页以获取详细信息。

尝试以下代码并使用fgets()函数从管道读取。

FILE *fp = popen("./CheckingScript.sh 3", "r");

不要忘记使用pclose()而不是fclose()来关闭fp。