请问一个进程编程的问题

afengfeng19 2007-09-26 07:26:47
《GNU/Linux编程指南第2版》第13张进程控制中有个例子程序,源代码getname.c如下:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <pwd.h>

int main(void)
{
char *login;
struct passwd *pentry;

/* Get the login name */
if((login = getlogin()) == NULL) { /* oops */
perror("getlogin");
exit(EXIT_FAILURE);
}

/* Get the password entry for login */
if((pentry = getpwnam(login)) == NULL) {
perror("getpwnam");
exit(EXIT_FAILURE);
}

/* Display the password entry */
printf("user name: %s\n", pentry->pw_name);
printf("UID : %d\n", pentry->pw_uid);
printf("GID : %d\n", pentry->pw_gid);
printf("gecos : %s\n", pentry->pw_gecos);
printf("home dir : %s\n", pentry->pw_dir);
printf("shell : %s\n", pentry->pw_shell);

exit(EXIT_SUCCESS);
}

该程序是显示哪个用户在运行进程,输出用户名、UID等信息。可是运行的时候出现问题,调用getlogin()函数后返回却是NULL,得不到用户名(我以普通用户身份登陆linux系统)
$./getname
getlogin:no such file or directory
请问是怎么回事?

...全文
134 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
geez 2007-09-28
  • 打赏
  • 举报
回复
用下面代码试一下:
#include <stdlib.h>
...
struct passwd *pentry;
...

pentry = getpwuid(geteuid());
if (!pentry) {
perror("getpwuid error");
return EXIT_FAILURE;
}

printf("%s\n", pentry->pw_name);
...
afengfeng19 2007-09-28
  • 打赏
  • 举报
回复
哪位大虾帮帮我了。
afengfeng19 2007-09-27
  • 打赏
  • 举报
回复
whoami命令能显示出用户名
没有/etc/utmp这个文件
有/var/run/utmp这个文件,但是用vi打开此文件里面全是乱码
请问怎么解决?
afengfeng19 2007-09-27
  • 打赏
  • 举报
回复
还是不行
dai_weitao 2007-09-27
  • 打赏
  • 举报
回复
你的login最好这样定义:
char login[256];

char *login是没有存储空间的, 所以造成段错误.
afengfeng19 2007-09-27
  • 打赏
  • 举报
回复
感谢楼上各位大虾的帮助,我现在用了cuserid(),只把上面程序中的getlogin()替换为cuserid(),程序编译的时候出现一个警告:在if((login = cuserid()) == NULL)这一行,赋值时将整数赋给指针,未作类型转换。
可是cuserid函数的返回值明明也是char *类型的,先不管,然后运行程序:
./getname
段错误
请问又是怎么回事?

后又写了一个程序:cu.c
#include <stdio.h>
main()
{
printf("I am %s\n", cuserid());
}
编译正常通过,没有警告。可是运行程序的时候还是出现“段错误”。
cceczjxy 2007-09-27
  • 打赏
  • 举报
回复
POSIX.1. System V has a cuserid function which uses the real user ID rather than the effective user ID. The
cuserid function was included in the 1988 version of POSIX, but removed from the 1990 version.
OpenBSD has getlogin and setlogin, and a username associated with a session, even if it has no controlling tty.

用cuserid()
可能是你的系统不支持getlogin函数.
dai_weitao 2007-09-27
  • 打赏
  • 举报
回复
vi当然不能打开, 这是二进制格式的.

那不应该会出现你的错误提示啊.
dai_weitao 2007-09-26
  • 打赏
  • 举报
回复
应该是/var/run/utmp吧
hefuhua 2007-09-26
  • 打赏
  • 举报
回复
who am i
显示出运行这条命令的用户的登录名.
看看有没有结果

在看看有没有这文件
/etc/utmp

684

社区成员

发帖
与我相关
我的任务
社区描述
智能路由器通常具有独立的操作系统,包括OpenWRT、eCos、VxWorks等,可以由用户自行安装各种应用,实现网络和设备的智能化管理。
linuxpython 技术论坛(原bbs)
社区管理员
  • 智能路由器社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧