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

标签 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();
 }
}

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

最佳答案

您遇到的段错误是因为以下行:

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引用。

关于c - 在Ubuntu上通过C程序显示所有登录用户的程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31472040/

相关文章:

将 void 指针转换为结构指针(在函数调用中)

c - 五子棋:限时搜索

c++ - unix域流套接字发送更多数据,那么它应该是

unix - 在 korn shell 中获取字符串的子字符串

c - scanf() 不提示输入标准输入

c++ - 有什么方法可以通过 SSH 连接打开和读取文件吗?

c++ - 链接时优化和内联

linux - 短语 "Reuse of local addresses is supported"是什么意思?

shell - 在使用 shell 脚本拆分文件名和文件夹路径方面需要帮助

java - 如何在Java中执行UNIX native 命令?