Unix 按它计算AIX中正在运行的进程';s的名字用C写

Unix 按它计算AIX中正在运行的进程';s的名字用C写,unix,process,kernel,aix,Unix,Process,Kernel,Aix,操作系统:IBMAIX5.3 编译器:xlc 大家好 我有一个项目,使用C来处理一些文件使用多个进程。子进程的数量主要取决于传入文件的数量和当前正在运行的进程的数量。我需要一个可靠的方法来计算有多少子进程在后台运行 通过比较效率,直接读取/proc目录可能比调用popen()执行$ps-ef | grep blah具有更好的性能 我编写了一个函数来读取/proc/pid/psinfo中的psinfo并比较这些片段。 伪代码如下: int count = 0; dp = opendir("/pro

操作系统:IBMAIX5.3

编译器:xlc

大家好

我有一个项目,使用C来处理一些文件使用多个进程。子进程的数量主要取决于传入文件的数量和当前正在运行的进程的数量。我需要一个可靠的方法来计算有多少子进程在后台运行

通过比较效率,直接读取
/proc
目录可能比调用popen()执行
$ps-ef | grep blah
具有更好的性能

我编写了一个函数来读取
/proc/pid/psinfo
中的psinfo并比较这些片段。 伪代码如下:

int count = 0;
dp = opendir("/proc");
while (readdir_r(...))
{
    if (dir is not a process)
        return -1;
    if (dir's owner is not current user)
        return -2;
    if (failed to open "/proc/[pid]/psinfo")
        return -3;
    if (failed to read "/proc/[pid]/psinfo")
        return -4;
    if (process's name matches the given pname)
        count += 1;
}
return count;
该函数通常在单次调用时运行良好。然而,当嵌入while循环时,它返回-2或-3甚至错误的计数

函数无法随机读取
/proc/pid
的属性。它告诉
没有这样的文件或目录

也有一个小机会得到错误的计数在最后。似乎有一个具有特定pid的额外进程,但在使用ps打印当前进程时消失了

我认为在父目录被列出后,当快速从子目录读取时,会发生任何变化

我有没有做错什么,或者有没有什么方法可以避免比赛状态?

来了解有关AIX中psinfo的更多信息

以下是完整的源代码:

#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int countProcess(char*pname)
{
DIR*DIR;
int-fd;
int-pid;
int-uid;
int pcounter=0;
结构psinfo pinfo;
结构直接入口;
结构方向*结果;
结构状态fsstat;
字符路径[256];
字符处理路径[256];
/*打开/proc目录*/
if((dir=opendir(“/proc”))==NULL)
{
返回-1;
}
/*检索当前用户id*/
uid=getuid();
/*浏览/proc目录*/
for(readdir\u r(dir,&entry,&result);result!=NULL;readdir\u r(dir,&entry,&result))
{
/*查看这是否是一个过程,例如,dirname是一个数字
如果没有,那么重新开始
*/
如果((pid=atoi(entry.d_name))==0)
{
持续
}
/*获取进程dir的属性*/
snprintf(进程路径),sizeof(进程路径),“/proc/%s”,entry.d\u name);
if(stat(进程路径和fsstat)=-1)
{
closedir(dir);
返回-2;
}
/*验证进程是否由当前用户运行
如果没有,那么重新开始
*/
如果(fsstat.st_uid!=uid)
{
持续
}
/*打开并读取psinfo文件*/
snprintf(path,sizeof(path),“/proc/%s/psinfo”,entry.d_name);
如果((fd=open(path,orduonly))<0)
{
关闭(fd);
closedir(dir);
返回-3;
}
if(读取(fd,&pinfo,大小OF(pinfo))<0)
{
关闭(fd);
closedir(dir);
返回-4;
}
/*字符串比较,如果相同,则增加计数器*/
如果(!strcmp(pinfo.pr_psargs,pname))
{
pcounter++;
}
关闭(fd);
}
/*返回计数器*/
closedir(dir);
返回pccounter;
}

更新日期:2015年1月13日 多亏了CoreyStup。procinfo.h中提供的getprocs()函数可以绕过竞争条件

下面是解决方案的代码

#包括
#包括
#包括
#包括
int countProcess(常量字符*pname)
{
结构procsinfo pinfo;
pid_t pid=0;
uid\u t uid;
字符args[256];
整数指数;
int pcounter=0;
memset(args,0,sizeof(args));
uid=getuid();
/*从内部API获取procsinfo*/
而(0
尝试使用
getprocs()
。我发现它比使用/proc或
ps
进行炮击效果更好


我在这里举了一个例子:

谢谢,这个方法可以通过传递比赛条件!