我正在C中工作,当用以下参数调用popen时遇到问题:
void exampleFunction(void) { . . . FILE* in = popen("alias -p","r"); . . . }
当我用这种方式给popen打电话时,我收到以下消息:
alias: -p not found
我不知道什么是错的,因为当我打电话给popen以下的论点时:
FILE* in = popen("ls -i","r");
没有问题,我使用相同的语法。
在Linux x86_64中是syscalls和int 0x80有关吗?
原始克隆系统调用
C中断系统调用
也许有人意识到真正的错误。
硬连接可以覆盖,而不使用临时文件?
find_task_by_pid()的替代方法
阻止Linux读取(2),直到所有计数字节到达
seccomp-bpf过滤系统调用如何?
alias命令内置在shell中。
像system() , popen调用/bin/sh来执行指定的命令。 你的交互式shell可能是bash,它支持一个-p选项给alias 。 /bin/sh ,这取决于你的系统配置,可能不会。
无论如何,即使这个工作,它也不会给你任何有用的信息。 popen()调用会调用一个新的shell,并且(再一次取决于你的配置),它可能不会设置你的别名,因为它不是交互式shell。
因为ls是一个外部命令,因此ls -i命令可以工作,所以无论从bash或/bin/sh还是从交互式或非交互式shell中调用它,它的工作方式都是一样的。 (有时ls可以被定义为别名或shell函数,但是这样的定义通常不会干扰-i选项的使用。)
alias不是可执行程序,而是内置的shell(把它想象成“bash脚本语言中的函数”),所以你不能用这个名字来打开一个进程。 你可以尝试愚弄bash并将其管入。像这样的未经测试的片段:
FILE* p = popen("/bin/bash","r"); // Note: on non-Linux-systems you might need another path or rely on $PATH fprintf(p,"alias -pn");
请注意,您也不能直接调用别名。 ls的不同之处在于ls存在,就像内置的程序一样。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。