免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1555 | 回复: 9
打印 上一主题 下一主题

突发奇想:能不能把系统调用的结果保存到C变量中 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-10-10 17:57 |只看该作者 |倒序浏览
举个例子来说:
在程序中system("date"执行结果就是在屏幕上打印出sun oct 10 16:00:00 cst 2004
如果C中有个变量为char sDate[100],能不能将system("date"显示的结果保存到sDate中呢?

论坛徽章:
0
2 [报告]
发表于 2004-10-10 19:12 |只看该作者

突发奇想:能不能把系统调用的结果保存到C变量中

用popen吧,
或者自己处理重定向

论坛徽章:
0
3 [报告]
发表于 2004-10-10 19:42 |只看该作者

突发奇想:能不能把系统调用的结果保存到C变量中

不是不得已而为之,不推荐这么做。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
4 [报告]
发表于 2004-10-10 22:51 |只看该作者

突发奇想:能不能把系统调用的结果保存到C变量中

为什么不推荐呢?

论坛徽章:
0
5 [报告]
发表于 2004-10-11 07:45 |只看该作者

突发奇想:能不能把系统调用的结果保存到C变量中

原因很多,比如
1。不方便移植,比如这个平台适用的命令到哪个平台未必完全一样。
2。效率低,由于系统命令的调用包含了fork,exec 等损耗资源的调用,如果在并发环境中,大量调用系统命令,会看见系统资源被迅速耗尽。
3。简单的shell 命令用c/c++很方便就能实现。复杂的shell 命令还是用c/++实现方便。
4。其他,不一而足。
5。调用系统命令仅适用在系统无法提供API函数支持或非常麻烦的情况下,如获取进程占用CPU、内存大小。
6。不在程序中调用系统命令不等于不善于使用SHELL编程,在系统管理时,SHELL是非常好用的工具,但有其适用环境。

论坛徽章:
0
6 [报告]
发表于 2004-10-11 10:31 |只看该作者

突发奇想:能不能把系统调用的结果保存到C变量中

"系统调用"的含义不是system()库函数,而是指
OS提供的APP接口.(如linux有300个syscall接口)

论坛徽章:
0
7 [报告]
发表于 2004-10-11 12:40 |只看该作者

突发奇想:能不能把系统调用的结果保存到C变量中

看文字结合上下文不要断章取义,咬文嚼字。

论坛徽章:
0
8 [报告]
发表于 2004-10-11 17:09 |只看该作者

突发奇想:能不能把系统调用的结果保存到C变量中

我并不是一定要用这种方法编程,不过就是想知道怎么解决,如果以后实在想不出招儿的时候说不定就能派上用场,嘿。。。。
另外,呢水平弱得很,还请诸位高手明示!谢过了先。。

--------------------------------------------------------------------
烟花烟花满天飞,你为谁妩媚,不过是醉眼看花,花也醉;
流沙流沙满天飞,谁为你憔悴,不过是~~缘来缘散~~缘如水……

论坛徽章:
0
9 [报告]
发表于 2004-10-11 17:23 |只看该作者

突发奇想:能不能把系统调用的结果保存到C变量中

最近,怎么老是有人问这个问题.
去搜索一下我的贴子,我回复过一个人,
是用管道实现的.

论坛徽章:
0
10 [报告]
发表于 2004-10-11 17:40 |只看该作者

突发奇想:能不能把系统调用的结果保存到C变量中

我是用管道实现的:
http://www.cnblogs.com/daniel/articles/29328.aspx

该程序用来执行由命令行传递的命令,并动态显示! 不对之处请各位大侠多多指教!!
例如运行如下:
./my_system ping 127.0.0.1 [回车]
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.078 ms

64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.053 ms

64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.052 ms

64 bytes from 127.0.0.1: icmp_seq=4 ttl=64 time=0.051 ms

64 bytes from 127.0.0.1: icmp_seq=5 ttl=64 time=0.052 ms

64 bytes from 127.0.0.1: icmp_seq=6 ttl=64 time=0.051 ms

........

//////////////////////////////////////////////////////////////////////
#include <stdio.h>;
#include <unistd.h>;
#include <string.h>;

static int my_system(const char* pCmd, char* pResult, int size)
{
int fd[2];
int pid;
int count;
int left;
char* p = 0;
int maxlen = size - 1;

memset(pResult, 0, size);//

if(pipe(fd))//
{
printf("pipe error\n";
return -1;
}

if( (pid = fork()) == 0 )//
{// chile process
close( 1 );
dup2( fd[1],1 );//
close( fd[1] );
close( fd[0] );
system( pCmd );//
exit( 0 );
}

// parent process
close( fd[1] );
p = pResult;
left = maxlen;
while( ( count = read( fd[0], p, left ) ) )//
{
pResult = p;
p += count;
left -= count;
if( left == 0 )
break;
printf( "%s\n", pResult );
}
close( fd[0] );
return 0;
}

int main( int argc, char *argv[] )
{
int i = 1;
char spac[] = " ";
char pCmd[1025];

if( argc < 2 )
{
printf( "Syntax error...\n" );
return 255;
}

memset(pCmd, 0, strlen(pCmd) );//
for( ; i < argc; i++ )
{
strcat( pCmd, argv );//
strcat( pCmd, spac );//
}
char result[1024];
my_system( pCmd, result, 1024 );//
printf( "\n%s\n", result );
return 0;
}

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

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP