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

C与Unix环境之间的异步通信,c,unix,asynchronous,C,Unix,Asynchronous,节目: 我的程序的目标是利用另一个程序来进行计算。问题是与该程序异步通信。下面是我用来调用另一个程序的代码的一部分。这是通过分布式计算脚本完成的 while(c < Images) { system(CommandArray[c]); k = chdir(ImageArray[c]); if(k != 0) { printf("Directory Change Failed!"); } else { s

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

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");
while(c
变量的含义:

  • ImageArray[c]:包含子目录(Image_1、Image_2等)的名称
  • SubScript.sh:这是一个脚本,用于将此程序的其余部分(代码未显示)生成的文件提交到服务器的头节点,并将这些作业发送给其他节点上的其他程序执行
  • CheckingScript.sh:一个简单的脚本,用于检查是否存在由下标生成的“状态”文件。如果文件存在,脚本将在该目录中等待,直到该文件不再存在。然后移动到下一个目录。这是一种判断工作是否由另一个程序完成的方法
问题:无论我做什么,我都无法让C程序等待结果返回,而不会导致其他程序正在工作的目录突然清空(文件仍然存在,但其内容被删除)。我曾尝试直接从C程序检查目录,但这导致了上述问题。因此,作为最后的手段,我试图写一个脚本来为我做检查。而且它有效!(其实不是…)我可以从命令行使用脚本,它可以按预期工作,但当我通过system()提交脚本时,它不会回显任何内置语句以显示它正在运行。这意味着system()执行,然后程序结束,而不从它应该等待的另一个程序收集结果


感谢您通读本文,我真的非常感谢您的帮助!我知道system()命令有点像恶棍,所以如果您对其他选项有任何建议,我们将不胜感激。有关我的程序的更多信息,请参阅我的博客:

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

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

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

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

阅读关于
fork
execv
pipe
您可以使用系统启动应用程序,也可以打开管道,也可以打开套接字,它们的语义都非常不同。。。但是你应该可以用它们中的任何一个来完成你想要的…我将阅读这些不同的主题(承诺),但我想如果我必须非常具体,我的问题是为什么我不能让system()等待脚本完成执行?@Jet
system
确实在等待脚本完成。但是您添加了一个额外的条件“不会导致其他程序正在工作的目录突然被清空”。现在还不清楚这种情况意味着什么,也不清楚为什么您认为系统有故障。或者你真的是说你观察到
系统
在脚本完成之前返回。@kaylum两者都有!我所说的第一位的意思是,如果我试图在程序中编写代码,它应该在前面的目录中循环,以检查另一个程序是否完成(通过检查“状态”文件),它在该目录中编写的文件现在已经不存在了。此外,“system()”确实会返回,但没有实际执行CheckingScript。