我有一个名为 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/