c 多次执行外部程序
c execute external program multiple times
我正在尝试使用一些参数从我的代码中调用外部程序。当我试图查看不同的参数如何改变它的输出时,我必须 运行 多次(大约 1000 次)。每次外部程序 运行s 我只对其输出的一行感兴趣,尽管它打印了很多(为了我的目的)无用的东西。我感兴趣的行就在输出中特殊标识符 ("some_signal") 的上方。所以我想我会等到这一行出现并阅读上面的行。
我尝试了以下方法:
pid_t pid = 0;
int pipefd[2];
FILE* output;
char line[256]; // pipe read buffer
char prev_line[256]; // prev. line pipe buffer
char signal[] = "some_signal\n";
int status = 0;
double obj_Val;
pipe (pipefd); //create pipe
pid = fork (); //span child process
if (pid == 0)
{
// redirect child's output to pipe
close (pipefd[0]);
dup2 (pipefd[1], STDOUT_FILENO);
dup2 (pipefd[1], STDERR_FILENO);
execl ("/some/path",
"some/path",
"some_argument", (char*) NULL);
}
else if (pid < (pid_t) 0)
{
printf("fork failed \n");
return EXIT_FAILURE;
}
else
{
// get child output to pipe
close (pipefd[1]);
output = fdopen (pipefd[0], "r");
while (fgets (line, sizeof(line), output), signal != NULL)
{
if(strcmp(line, signal) == 0)
{
obj_Val = atof (prev_line);
kill (pid, SIGTERM);
waitpid (pid, &status, WNOHANG);
kill (pid, SIGKILL);
waitpid (pid, &status, 0);
break;
}//end if
strcpy (prev_line, line);
}//end while
}
这可以正常工作大约 100 运行 秒左右,然后出现两分之一的错误。第一个是分段错误。第二个是调用程序打印出被调用程序的所有输出(没有包含所需信号的行)并进入无限循环(我的猜测是,因为信号丢失 while 循环不会终止)。
也许有人可以提供提示或 link 在哪里寻找以及寻找什么,或者最好告诉我我做错了什么。
您的 while
条件被破坏:signal != NULL
始终为真,因为 signal
是一个数组;由于逗号 ,
运算符,整个条件始终为真。
并且由于以下原因,您没有检查 fgets
的 return 值,这意味着未读取任何内容且缓冲区未初始化。
此外,prev_line
在您第一次对其进行 atof
之前未进行初始化。
无论如何,用-Wall -Werror
编译并修复剩余的错误。
我正在尝试使用一些参数从我的代码中调用外部程序。当我试图查看不同的参数如何改变它的输出时,我必须 运行 多次(大约 1000 次)。每次外部程序 运行s 我只对其输出的一行感兴趣,尽管它打印了很多(为了我的目的)无用的东西。我感兴趣的行就在输出中特殊标识符 ("some_signal") 的上方。所以我想我会等到这一行出现并阅读上面的行。
我尝试了以下方法:
pid_t pid = 0;
int pipefd[2];
FILE* output;
char line[256]; // pipe read buffer
char prev_line[256]; // prev. line pipe buffer
char signal[] = "some_signal\n";
int status = 0;
double obj_Val;
pipe (pipefd); //create pipe
pid = fork (); //span child process
if (pid == 0)
{
// redirect child's output to pipe
close (pipefd[0]);
dup2 (pipefd[1], STDOUT_FILENO);
dup2 (pipefd[1], STDERR_FILENO);
execl ("/some/path",
"some/path",
"some_argument", (char*) NULL);
}
else if (pid < (pid_t) 0)
{
printf("fork failed \n");
return EXIT_FAILURE;
}
else
{
// get child output to pipe
close (pipefd[1]);
output = fdopen (pipefd[0], "r");
while (fgets (line, sizeof(line), output), signal != NULL)
{
if(strcmp(line, signal) == 0)
{
obj_Val = atof (prev_line);
kill (pid, SIGTERM);
waitpid (pid, &status, WNOHANG);
kill (pid, SIGKILL);
waitpid (pid, &status, 0);
break;
}//end if
strcpy (prev_line, line);
}//end while
}
这可以正常工作大约 100 运行 秒左右,然后出现两分之一的错误。第一个是分段错误。第二个是调用程序打印出被调用程序的所有输出(没有包含所需信号的行)并进入无限循环(我的猜测是,因为信号丢失 while 循环不会终止)。 也许有人可以提供提示或 link 在哪里寻找以及寻找什么,或者最好告诉我我做错了什么。
您的 while
条件被破坏:signal != NULL
始终为真,因为 signal
是一个数组;由于逗号 ,
运算符,整个条件始终为真。
并且由于以下原因,您没有检查 fgets
的 return 值,这意味着未读取任何内容且缓冲区未初始化。
此外,prev_line
在您第一次对其进行 atof
之前未进行初始化。
无论如何,用-Wall -Werror
编译并修复剩余的错误。