execve的返回值是啥
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了execve的返回值是啥相关的知识,希望对你有一定的参考价值。
Linux下的都来了。LZ算是强人了。真心十分佩服
相关函数 fork,execl,execle,execlp,execv,execvp
表头文件 #include <unistd.h >
定义函数 int execve(const char * filename,char * const argv[ ],char * const envp[ ]);
函数说明 execve()用来执行参数filename字符串所代表的文件路径,第二个参数系利用数组指针来传递给执行文件,最后一个参数则为传递给执行文件的新环境变量数组。
返回值 如果执行成功则函数不会返回,执行失败则直接返回-1,失败原因存于errno 中。
错误代码 EACCES
1. 欲执行的文件不具有用户可执行的权限。
2. 欲执行的文件所属的文件系统是以noexec 方式挂上。
3.欲执行的文件或script翻译器非一般文件。
EPERM
1.进程处于被追踪模式,执行者并不具有root权限,欲执行的文件具有SUID 或SGID 位。
2.欲执行的文件所属的文件系统是以nosuid方式挂上,欲执行的文件具有SUID 或SGID 位元,但执行者并不具有root权限。
E2BIG 参数数组过大
ENOEXEC 无法判断欲执行文件的执行文件格式,有可能是格式错误或无法在此平台执行。
EFAULT 参数filename所指的字符串地址超出可存取空间范围。
ENAMETOOLONG 参数filename所指的字符串太长。
ENOENT 参数filename字符串所指定的文件不存在。
ENOMEM 核心内存不足
ENOTDIR 参数filename字符串所包含的目录路径并非有效目录
EACCES 参数filename字符串所包含的目录路径无法存取,权限不足
ELOOP 过多的符号连接
ETXTBUSY 欲执行的文件已被其他进程打开而且正把数据写入该文件中
EIO I/O 存取错误
ENFILE 已达到系统所允许的打开文件总数。
EMFILE 已达到系统所允许单一进程所能打开的文件总数。
EINVAL 欲执行文件的ELF执行格式不只一个PT_INTERP节区
EISDIR ELF翻译器为一目录
ELIBBAD ELF翻译器有问题。 参考技术A 应用楼上的
"返回值 如果执行成功则函数不会返回,执行失败则直接返回-1,失败原因存于errno 中。 "
Python 中 os.system() 的返回值是啥?
【中文标题】Python 中 os.system() 的返回值是啥?【英文标题】:What is the return value of os.system() in Python?Python 中 os.system() 的返回值是什么? 【发布时间】:2011-09-21 22:37:14 【问题描述】:我遇到了这个:
>>> import os
>>> os.system('ls')
file.txt README
0
os.system()
的返回值是多少?为什么我得到 0?
【问题讨论】:
os.system("ls")
用于运行您只关心它是否运行的命令。如果您想要标准输出输出,请使用此处定义的 commands.getstatusoutput("ls")[1]
之类的内容:docs.python.org/2/library/commands.html
(但是,如果您不采取其他措施,os.system("ls")
将输出ls
的结果。在这种情况下,我不确定您是否想要抑制附加输出,但如果你这样做了,一种方法是os.system("ls > /dev/null 2>&1")
。
只是为了说明这一点,os.system
的文档非常明确地建议您避免使用它,而使用 subprocess
。有一个函数只运行一个命令并返回其结果代码 (subprocess.call
) 和一个从命令中检索输出 (subprocess.check_output
) 以及一个在命令失败时失败的函数 (subprocess.check_call
)。有一个现代的高级函数 subprocess.run
可以完成这三个功能,甚至更多。
【参考方案1】:
"在Unix上,返回值是出口 编码在进程中的状态 为 wait() 指定的格式。注意 POSIX 没有具体说明 C system() 的返回值 函数,所以返回值 Python 函数依赖于系统。”
http://docs.python.org/library/os.html#os.system
没有错误,所以退出码为零
【讨论】:
返回代码 os os.wait() 对返回值和终止进程的信号进行编码。见***.com/a/7616227/496127【参考方案2】:os.system
的返回值取决于操作系统。
在 Unix 上,返回值是一个 16 位数字,其中包含两条不同的信息。来自文档:
一个16位的数字,低字节是杀死进程的信号号,高字节是退出状态(如果信号号为零)
因此,如果信号编号(低字节)为 0,理论上将结果移动 8 位(result >> 8
)以获取错误代码是安全的。函数os.WEXITSTATUS
正是这样做的。如果错误码为0,则通常表示进程无错误退出。
在 Windows 上,文档指定 os.system
的返回值取决于 shell。如果shell为cmd.exe
(默认),则值为进程的返回码。同样,0 表示没有错误。
对于其他错误代码:
on Linux on Windows【讨论】:
OS 维护一个 errno 作为变量,该变量具有最近执行的进程的退出状态。 erron是全局的,这个errno值在执行后返回,说明cmd执行成功还是失败 这不是答案,Linux 链接现在没有任何用处。 @SteveBennett 谢谢,我修复了链接。为什么你认为它不符合作为答案的条件?问题是“这个数字是多少”,我给出了答案。 @brandones 感谢您指出这一点。这个答案是很久以前写的,显然缺少重要信息。现在应该是正确的。 固体。很抱歉语气,我刚刚花了一段时间来解决这样的错误。请注意,您可以使用os.WEXITSTATUS(os.system(command))
获取退出状态。【参考方案3】:
os.system() 返回一些 unix 输出,而不是命令输出。所以,如果没有错误则退出代码写为0。
【讨论】:
【参考方案4】:os.system('command')
返回一个 16 位的数字,左起 8 位(lsb)表示 os 用于关闭命令的信号,后 8 位表示命令的返回码。
00000000 00000000
exit code signal num
示例 1 - 代码为 1 的命令退出
os.system('command') #it returns 256
256 in 16 bits - 00000001 00000000
Exit code is 00000001 which means 1
示例 2 - 代码为 3 的命令退出
os.system('command') # it returns 768
768 in 16 bits - 00000011 00000000
Exit code is 00000011 which means 3
现在尝试使用信号 - 示例 3 - 编写一个长时间休眠的程序,将其用作 os.system() 中的命令,然后通过 kill -15 或 kill -9 杀死它
os.system('command') #it returns signal num by which it is killed
15 in bits - 00000000 00001111
Signal num is 00001111 which means 15
您可以将 python 程序设置为 command = 'python command.py'
import sys
sys.exit(n) # here n would be exit code
如果是 c 或 c++ 程序,您可以使用 main() 的 return 或任何函数的 exit(n) #
注意 - 这适用于 unix
在 Unix 上,返回值是进程的退出状态,编码为 为 wait() 指定的格式。请注意,POSIX 没有指定 C system() 函数的返回值的含义,所以返回 Python 函数的值取决于系统。
os.wait()
等待子进程完成,并返回一个包含其 pid 和退出状态指示的元组:一个 16 位数字,其 低字节是杀死进程的信号号,其高 byte 是退出状态(如果信号编号为零);高位 如果生成了核心文件,则设置低字节。
Availability: Unix
.
【讨论】:
你能发布任何说明这一点的文档或链接吗? @shane 我的答案适用于 unix,我不确定在 windows 上,我在下面提到了 - docs.python.org/2/library/os.html#os.system,它说它的返回将根据系统调用 wait(),然后我提到- docs.python.org/2/library/os.html#os.wait 注意:您可以使用os.WEXITSTATUS(os.system(my_call))
获取返回码。因此,例如sys.exit(os.WEXITSTATUS(os.system('exit 2')))
将以状态码 2 退出。【参考方案5】:
你可能想使用
return_value = os.popen('ls').read()
相反。 os.system
只返回错误值。
os.popen
是subprocess.Popen
函数的更简洁的包装器,如 Python 源代码所示。
【讨论】:
对于os.system
文档中明确说明的指导的另一种疯狂替代方法:改用subprocess
。
@triplee 我认为如果你查看实际 python 代码 (github.com/python/cpython/blob/master/Lib/os.py) 中的 os.popen 函数,你会发现它无论如何都使用 subprocess.Popen。【参考方案6】:
如果你想在命令提示符下存储运行命令的输出
os.system("")
这是一种将输出存储在变量output
中的替代方法
# code to execute a command and store it's output in a variable import subprocess as sp output = sp.getoutput("whoami") print(output)
【讨论】:
以上是关于execve的返回值是啥的主要内容,如果未能解决你的问题,请参考以下文章