当前位置: 技术问答>linux和unix
请教unix下execvp和system函数的问题
来源: 互联网 发布时间:2016-03-30
本文导语: 今天在AIX下写程序,发现如下问题: 我在配置文件里面存储一个命令,例如cp /home/*.txt ./ 我还程序里面读出这个命令,然后用execvp或system去调用。 发现用execvp调用的时候,不支持通配符,也就是说cp /home/a.txt ....
今天在AIX下写程序,发现如下问题:
我在配置文件里面存储一个命令,例如cp /home/*.txt ./
我还程序里面读出这个命令,然后用execvp或system去调用。
发现用execvp调用的时候,不支持通配符,也就是说cp /home/a.txt ./ 就可以执行成功,如果是 cp /home/*.txt ./ 就不行,提示/home/*.txt不存在。
而用system 不会出现这个问题。 两种都支持, 但是system调用有个问题, 因为他是先fork一个子进程,起一个shell, 然后再去调用命令。 所以如果命令失败他得到的返回值还是0, 因为shell没有出错。
请教大侠,如何用execvp调用的时候也能支持通配符, 或者用system可以得到程序返回值?
我在配置文件里面存储一个命令,例如cp /home/*.txt ./
我还程序里面读出这个命令,然后用execvp或system去调用。
发现用execvp调用的时候,不支持通配符,也就是说cp /home/a.txt ./ 就可以执行成功,如果是 cp /home/*.txt ./ 就不行,提示/home/*.txt不存在。
而用system 不会出现这个问题。 两种都支持, 但是system调用有个问题, 因为他是先fork一个子进程,起一个shell, 然后再去调用命令。 所以如果命令失败他得到的返回值还是0, 因为shell没有出错。
请教大侠,如何用execvp调用的时候也能支持通配符, 或者用system可以得到程序返回值?
|
system 调用的是 sh -c cp /home/*.txt ./
pathname expansion 是由sh来做的。 返回值是最后一个命令的返回值左移8位, 要用WEXITSTATUS(status)来看。
要用execvp的话就要自己做expansion的match.
pathname expansion 是由sh来做的。 返回值是最后一个命令的返回值左移8位, 要用WEXITSTATUS(status)来看。
要用execvp的话就要自己做expansion的match.