LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2372|回复: 17

请问:在linux c程序中怎么嵌入shell命令?

[复制链接]
发表于 2005-4-29 17:22:13 | 显示全部楼层 |阅读模式
我在linux的socket程序中想嵌入shell命令,是不是需要绑定程序才能编译通过?谢谢大家!
发表于 2005-4-29 17:55:00 | 显示全部楼层
难道是system("****");

我也是新手,不懂,

随便提点意见。
回复 支持 反对

使用道具 举报

发表于 2005-4-29 20:00:14 | 显示全部楼层
system,exec族函数都可以
回复 支持 反对

使用道具 举报

发表于 2005-4-30 00:53:09 | 显示全部楼层
你懂C吗?看来你还是个菜鸟!
回复 支持 反对

使用道具 举报

发表于 2005-5-1 02:25:08 | 显示全部楼层
不明白为什么要在C中调用shell程序呢? C作为底层系统语言可直接调用系统函数,何必用绕道上层的shell,然后shell不还是要调用系统函数和命令? 这样的C程序在效率上肯定会打折扣。
回复 支持 反对

使用道具 举报

发表于 2005-5-1 09:26:59 | 显示全部楼层
Post by yongjian
不明白为什么要在C中调用shell程序呢? C作为底层系统语言可直接调用系统函数,何必用绕道上层的shell,然后shell不还是要调用系统函数和命令? 这样的C程序在效率上肯定会打折扣。


这是个造轮子的的问题了,有了现成的,非得要重新再重写一次吗?只要是不必在效率上要求太高,都可使用system来调用shell,但是system函数或是exec族,或是popen & pclose对函数这样是有一些问题的,我的忧虑是,非所有的机器的用户PATH变量都是要的,有些故意清空,以保护服务器的安全,此时要强制指定shell命令的全路径非常的麻烦,不具有很好的通用性.
回复 支持 反对

使用道具 举报

发表于 2005-5-1 16:32:50 | 显示全部楼层
Post by kiron
这是个造轮子的的问题了,有了现成的,非得要重新再重写一次吗?只要是不必在效率上要求太高,都可使用system来调用shell,但是system函数或是exec族,或是popen & pclose对函数这样是有一些问题的,我的忧虑是,非所有的机器的用户PATH变量都是要的,有些故意清空,以保护服务器的安全,此时要强制指定shell命令的全路径非常的麻烦,不具有很好的通用性.


系统调用还是要比shell命令来的效率高。我想C这样高效的程序还是要尽量少用shell命令。
回复 支持 反对

使用道具 举报

发表于 2005-5-1 16:53:05 | 显示全部楼层
Post by yongjian
系统调用还是要比shell命令来的效率高。我想C这样高效的程序还是要尽量少用shell命令。

No,一些基本的应用,直接调用系统命令(也就是楼主所说的shell命令)会很方便,比如ls,那如果这些简单的命令都要说到系统调用,岂不自寻烦恼,而且,系统调用,该怎么掉?你知道么?反正我是不知道. :cool:而且写C的时候不仅经常用到shell命令,在Window下,还经常要用到DOS命令.例如在*nix下:
[php]
#include <stdlib.h>
#include <stdio.h>

int main()
{
    printf("Running ps with system\n");
    system("ps -ax");
    printf("Done.\n");
    exit(0);
}
[/php]
回复 支持 反对

使用道具 举报

发表于 2005-5-1 17:10:52 | 显示全部楼层
BTW:当然,你也可以使用exec族命令,比如:

execl("/bin/ps", "ps", "-ax", 0);        
execlp("ps", "ps", "-ax", 0);              
execle("/bin/ps", "ps", "-ax", 0, ps_envp);
execv("/bin/ps", ps_argv);
execvp("ps", ps_argv);
execve("/bin/ps", ps_argv, ps_envp);

NOTES:system并非一个高效的方法,因为当你运行它时,它会启动一个shell,然后执行其中的命令,直到命令执行完毕,才返回原(C)程序,一个解决办法是将shell命令放入后台,例如使用system("ps -ax &");来取代上面的命令.
回复 支持 反对

使用道具 举报

发表于 2005-5-1 17:52:59 | 显示全部楼层
Post by Freebird
BTW:当然,你也可以使用exec族命令,比如:

execl("/bin/ps", "ps", "-ax", 0);        
execlp("ps", "ps", "-ax", 0);              
execle("/bin/ps", "ps", "-ax", 0, ps_envp);
execv("/bin/ps", ps_argv);
execvp("ps", ps_argv);
execve("/bin/ps", ps_argv, ps_envp);

NOTES:system并非一个高效的方法,因为当你运行它时,它会启动一个shell,然后执行其中的命令,直到命令执行完毕,才返回原(C)程序,一个解决办法是将shell命令放入后台,例如使用system("ps -ax &");来取代上面的命令.

佩服佩服~~~
在awk和perl里也都调用shell命令
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表