2015-11-11 39 views
0

程序: 我的程序的目标是利用另一个程序来执行它的计算。问题是与该程序异步通信。以下是我用来调用其他程序的一段代码。这是通过分布式计算脚本完成的。C和Unix环境之间的异步通信

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生成的“状态”文件是否存在。如果文件存在,脚本将在该目录中等待,直到该文件不再存在。然后移动到下一个目录。这是为了告诉其他程序是否完成了这项工作。

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

感谢您阅读本文,我非常感谢帮助!我知道系统()命令是有点暴躁,所以任何有关替代选项的建议将不胜感激。有关我的程序的更多信息,请参阅我的博客:Link to Blog

+3

阅读关于'fork','execv'和'pipe' – fghj

+0

你可以用系统启动一个应用程序,或者你可以打开一个管道,或者你可以打开一个套接字,它们都有不同的语义......但是你应该能够完成你想要的任何他们... –

+0

我会阅读这些不同的主题(承诺),但我想如果我必须非常具体我的问题将是为什么我不能得到系统( )等待脚本完成执行? – Jet

回答

0

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

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

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

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