高手请时: 通过访问/proc 怎样获得进程的参数列表 

发表于:2007-05-26来源:作者:点击数: 标签:
我的程序如下: intgetArgList(intfd,PROCSTAT*pProcStat,psinfo_t*pPsinfo) { char*argv[MAX_ARG_NUM]; intret,argIndex; intmemSize; intargc=pPsinfo-pr_argc; pProcStat-argc=argc; memSize=argc*sizeof(char*); de bug Msg(4,DebugLevel,"psinfoargc:%d

我的程序如下:

int getArgList(int fd, PROCSTAT * pProcStat, psinfo_t * pPsinfo)
{
char *argv[MAX_ARG_NUM];
int ret, argIndex;
int memSize;
int argc = pPsinfo->pr_argc;
pProcStat->argc = argc;

memSize = argc * sizeof(char *);
debugMsg(4, DebugLevel, "psinfo argc: %d, memSize: %d, pointer: %u\n", argc, memSize, (ULONG)pPsinfo->pr_argv);
[b:1c7e4f6005]ret = pread(fd, argv, memSize, pPsinfo->pr_argv);[/b:1c7e4f6005]
if (ret <= 0)
{
errormsg(1, "read psinfo argv pointer vector fail, retvalue: %d, errno: %d\n", ret, errno);
return -3; 
}

for (argIndex = 0; argIndex < argc; argIndex++)
{
if (pProcStat->argv[argIndex] == NULL)
{
errormsg(1, "read psinfo argv fail, argc %d, index: %d\n", argc, argIndex);
return -1;
}
ret = pread(fd, pProcStat->argv[argIndex], MAX_ARG_STRING, argv[argIndex]);
if (ret <= 0)
{
errormsg(1, "read psinfo argv fail, ret: %d, errno: %d\n", 
            ret, errno);
return -1;            
}
debugMsg(4, DebugLevel, "index %d, argv: %s\n", argIndex, pProcStat->argv[argIndex]);
}
return 0;
}

在程序实际运行过程中,我有一个进程,其argc为3,但每次在执行
ret = pread(fd, argv, memSize, pPsinfo->pr_argv)
语句时,结果为:
ret=0, errno=0,
很郁闷的错误,实际上参数个数已经为3。

请高手回答怎样获得正确的参数列表。

 ublue 回复于:2004-12-02 12:57:31
我已经采用另一种方式解决了。
psinfo_t结构中的pr_psargs可以获得参数列表。

 sunlan 回复于:2004-12-02 13:14:19
通过访问/proc目录获取进程列表的通用性不是很好。一般性的做法是将ps的结果通过管道传送到程序里,然后再进行解析。

原文转自:http://www.ltesting.net