微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在使用popen时找不到命令

我正在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有关吗?

原始克隆系统调用

system()调用行为

C中断系统调用

也许有人意识到真正的错误

硬连接可以覆盖,而不使用临时文件

find_task_by_pid()的替代方法

阻止Linux读取(2),直到所有计数字节到达

seccomp-bpf过滤系统调用如何?

如何禁止系统调用,GNU / Linux

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] 举报,一经查实,本站将立刻删除。

相关推荐