加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C程序调用shell脚本

发布时间:2020-12-16 10:40:20 所属栏目:百科 来源:网络整理
导读:我有一个小的C程序调用 shell脚本myScript.sh.我得到ret的值为256.请帮助我知道系统调用出了什么问题? int main(){int ret;ret = system (myScript.sh);ret = ret;if (ret != 0){ printf("ret is [%d]",ret);}} 使用64位UNIX操作系统并使用ksh shell 解决方
我有一个小的C程序调用 shell脚本myScript.sh.我得到ret的值为256.请帮助我知道系统调用出了什么问题?

int main()
{
int ret;
ret = system (myScript.sh);
ret >>=  ret;
if (ret != 0)
{
  printf("ret is [%d]",ret);
}
}

使用64位UNIX操作系统并使用ksh shell

解决方法

系统函数通常在* nix上运行的方式是它调用fork然后子进程使用/ bin / sh -c调用其中一个exec函数,然后调用传递给子进程中系统的字符串,这将转换子进程进入运行该命令的/ bin / sh程序的实例.父调用等待函数之一,等待/ bin / sh退出,它使用与shell脚本相同的退出状态,然后系统也返回该值.

如果查看等待系统调用的手册页:

main 3 wait

您应该获得一些有关返回内容的信息以及一些帮助您理解它的宏函数.

WIFEXITED(stat_val)宏可用于测试程序是否正常退出而不是信号.正常退出涉及调用退出系统调用.如果此函数返回非零值,则可以使用WEXITSTATUS(stat_val)宏来获取实际返回的值.

WIFSIGNALED(stat_val)宏可用于测试程序是否以信号终止,如果是,则WTERMSIG(stat_val)宏将返回导致终止的信号编号.

还有一些其他的宏可以告诉你这个过程是停止还是继续,而不是终止,但我不认为它们对你有太大的帮助,但是你可能想要研究它们.

就这种情况实际发生的情况而言,可能很难说清楚.如果fork调用失败,则系统将能够返回-1并设置errno以反映错误.如果fork没有失败,则可能在孩子身上发生了错误并且更难以找到.您可能有可能在您的平台系统上执行某些测试,然后分叉以确保您有权执行相应的文件并设置errno以反映该情况,但可能不会.

您应该查看perror函数,以便在设置了errno的情况下打印出错误消息.

如果失败发生在fork之后和子进程内,那么你需要让shell告诉你更多关于发生了什么的事情,或者获取shell脚本.这可以通过在脚本中包含echo语句,类似于在C程序中使用print语句.

您还应该查看访问函数以测试您是否有权读取和/或执行文件.

如果您使用的是Linux,那么您应该可以:

strace -o my_program.strace -f ./my_program

要么

ltrace -o my_program.ltrace -f -S ./my_program

然后检查跟踪文件(在-o之后)以查看程序和内核相互之间的说法. ltrace查看程序如何与库函数对话,而strace查看系统调用,但-S告诉ltrace也查看系统调用. -f参数告诉他们在创建程序时跟踪程序的子项.

我刚刚注意到你说你正在使用ksh

正如我所提到的,Posix系统下的系统应该使用/ bin / sh或兼容的shell.这并不意味着/ bin / sh不会运行/ bin / ksh来运行你的脚本(或者内核不会使用脚本文件开头的#!行来执行此操作),但它可以是个问题.有一些方法可以运行shell脚本,以便不使用此行来知道要使用哪个shell.最值得注意的是:

. myshell.sh

句点和空间实质上是尝试将文件的文本转储到当前的shell会话中,而不是在另一个进程中运行它(这对于设置环境很有用).如果你要这样做:

int x = system(". myshell.sh");

那可能是个问题.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读