linux下system函数调用shell命令后,怎样让主进程等子进程返回后,接着执行
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux下system函数调用shell命令后,怎样让主进程等子进程返回后,接着执行相关的知识,希望对你有一定的参考价值。
参考技术A 这是进程间同步的问题。解决方法是:fork一个子进程执行system调用,父进程调用 wait 或 waitpid 等待子进程的终止信息。父进程调用 wait 或 waitpid 时可能会:
• 阻塞(如果它的所有子进程都还在运行)。
• 带子进程的终止信息立即返回(如果一个子进程已终止,正等待父进程读取其终止信息)。
• 出错立即返回(如果它没有任何子进程)。
wait 和 waitpid 这两个函数的区别是:
• 如果父进程的所有子进程都还在运行,调用wait将使父进程阻塞,而调用waitpid时如果在options参数中指定WNOHANG可以使父进程不阻塞而立即返回0。
• wait等待第一个终止的子进程,而waitpid可以通过pid参数指定等待哪一个子进程。本回答被提问者采纳
linux c使用system调用shell脚本
嵌入式linux QQ交流群:175159209,欢迎爱好者加入交流技术问题!
system的原理其实就是调用fork创建子进程去执行shell命令,然后返回最后一条shell命令的状态值。linux下man system可以看到返回值说明:
1.如果返回值等于-1就是system函数执行失败,准确的说是fork创建子进程失败。
2.shell执行最后一条语句的状态值放在返回值的低8位,使用WEXITSTATUS宏可以获得状态值。
3.使用WIFEXITED宏取返回值判断是否执行成功,如果返回真就成功。
综上,可以看出来,首先我们要判断system返回值不等于-1那么fork成功了,然后判断WIFEXITED为真那么调用shell成功,最后判断WEXITSTATUS获得shell执行状态值是否为0就是成功。
int sh_shell(const char *command)
{
int ret = system(command);
if (-1 == ret)
{
printf("sh_shell fork fail");
return -1;
}
else
{
printf("sh_shell exit ret = 0x%x", ret);
if (WIFEXITED(ret))
{
if (0 == WEXITSTATUS(ret))
{
printf("sh_shell success");
return 0;
}
else
{
printf("sh_shell fail, shell status: %d", WEXITSTATUS(ret));
return -1;
}
}
else
{
printf("sh_shell exit status = %d", WEXITSTATUS(ret));
return -1;
}
}
}
在脚本中你想返回自定义值,也是可以通过return或者exit返回给程序,程序通过system返回值获得。
以上是关于linux下system函数调用shell命令后,怎样让主进程等子进程返回后,接着执行的主要内容,如果未能解决你的问题,请参考以下文章