程序通过Ubuntu上的C程序显示所有登录用户?

时间:2015-07-17 09:02:16

标签: c unix

我有一个名为allloggedin.c的程序,其目的是显示所有已登录的用户。

每当我尝试在终端上运行它(使用gcc)时,它会给出错误 "分段错误(核心转储)"。

#include<stdio.h>
#include<sys/utsname.h>
#include<utmp.h>

int main(void)
{
 struct utmp *n;
 char *a;
 int i;
 setutent();
 n=getutent();

 while(n!=NULL)
 {
  if(n->ut_type==7)
  {
   printf("%9s",n->ut_user);
   printf("%12s",n->ut_line);

   printf(" ");
   for(i=4;i<16;i++)
   printf("%c",a[i]);
   printf(" (");
   printf("%s10",n->ut_host);
   printf(")");
   printf("\n");
  }
  n=getutent();
 }
}

有人能解释一下这个程序吗?

1 个答案:

答案 0 :(得分:2)

你得到的分段错误是由于行:

printf("%c",a[i]);

由于您没有初始化指针a,因此它可以指向任何地址,当您取消引用它时可能会导致分段错误。

我不确定你要在for循环中打印什么,所以我完全从代码中删除了它。

这是代码的清理版本:

#include<stdio.h>
#include<sys/utsname.h>
#include<utmp.h>

int main(void)
{
  struct utmp *n;
  setutent();
  n=getutent();

  while(n) {
    if(n->ut_type==USER_PROCESS) {
      printf("%9s%12s (%s)\n", n->ut_user, n->ut_line, n->ut_host);
    }
    n=getutent();
  }
  return 0;
}

我用适当的宏USER_PROCESS替换了数字7。此外,您可以将所有打印件放在一个printf调用中。

所以程序基本上做的是为每个用户获取utmp结构并以一种奇特的方式打印它。

有关所用函数和utmp结构的更多信息,您可以查看utmp.h参考。