当我们使用system()
命令时,程序会一直等到它完成但是我正在使用process
并使用负载平衡服务器执行system()
,因为在执行之后哪个程序到达下一行系统命令。请注意,process
可能不完整。
system("./my_script");
// after this I want to see whether it is complete or not using its pid.
// But how do i Know PID?
IsScriptExecutionComplete();
答案 0 :(得分:7)
简单回答:你不能。
system()
的目的是阻止何时执行命令。
但你可以欺骗'像这样:
pid_t system2(const char * command, int * infp, int * outfp)
{
int p_stdin[2];
int p_stdout[2];
pid_t pid;
if (pipe(p_stdin) == -1)
return -1;
if (pipe(p_stdout) == -1) {
close(p_stdin[0]);
close(p_stdin[1]);
return -1;
}
pid = fork();
if (pid < 0) {
close(p_stdin[0]);
close(p_stdin[1]);
close(p_stdout[0]);
close(p_stdout[1]);
return pid;
} else if (pid == 0) {
close(p_stdin[1]);
dup2(p_stdin[0], 0);
close(p_stdout[0]);
dup2(p_stdout[1], 1);
dup2(::open("/dev/null", O_RDONLY), 2);
/// Close all other descriptors for the safety sake.
for (int i = 3; i < 4096; ++i)
::close(i);
setsid();
execl("/bin/sh", "sh", "-c", command, NULL);
_exit(1);
}
close(p_stdin[0]);
close(p_stdout[1]);
if (infp == NULL) {
close(p_stdin[1]);
} else {
*infp = p_stdin[1];
}
if (outfp == NULL) {
close(p_stdout[0]);
} else {
*outfp = p_stdout[0];
}
return pid;
}
此处您不仅可以使用 PID 进程,还可以使用 STDIN 和 STDOUT 。玩得开心!
答案 1 :(得分:1)
不是我自己的专家,但是如果你看一下man page for system:
system()通过调用/ bin / sh -c命令执行命令中指定的命令,并在命令完成后返回
您可以在您执行的命令/脚本中进入后台(并立即返回),但我不认为系统中有针对该案例的具体规定。
我能想到的想法是:
答案 2 :(得分:0)
您可以通过以下代码检查命令的退出状态:
int ret = system("./my_script");
if (WIFEXITED(ret) && !WEXITSTATUS(ret))
{
printf("Completed successfully\n"); ///successful
}
else
{
printf("execution failed\n"); //error
}