从文件读取管道命令并通过fork/exec执行失败问题排查
问题原因与解决方法
核心问题出在命令参数的拆分逻辑错误,导致exec系列函数传递给sort的参数格式不符合要求:
- 手动指定
exec参数时,你是把sort、-n、-r作为独立的数组元素传递的,这符合exec的规则——每个命令、选项、参数都必须是单独的字符串。 - 但从文件读取命令后,你大概率直接把
sort -n -r作为一个完整字符串传给了exec。比如错误构造了这样的参数数组:
这种情况下,char *sort_args[] = {"sort -n -r", NULL};sort会把整个字符串sort -n -r当成一个命令行参数,解析为一个非法的长选项-n -r,自然触发"非法选项"错误。
正确处理步骤
- 拆分管道命令:先按
|将读取到的整行命令拆分为左右两个独立的命令段(比如ps -lu user和sort -n -r)。 - 拆分单个命令的参数:对每个命令段,按空白字符(空格、制表符等)拆分为单独字符串,注意处理多空格、制表符,若有带空格的参数(如含空格的文件名),需保留引号内内容作为单个参数。
- 构造
exec参数数组:每个命令的参数数组第一个元素是命令名(比如sort),后面依次是各个选项和参数,最后以NULL结尾。例如:char *sort_args[] = {"sort", "-n", "-r", NULL}; - 调用
exec函数:使用execvp这类自动查找命令路径的函数,或指定完整路径的execv,传递正确的参数数组。
内容的提问来源于stack exchange,提问作者Juan Almodóvar
相关产品推荐
相关产品推荐

