Linux程序接口实验:取进程标志及用户信息

0.环境平台

操作系统平台:

Linux leaf 4.4.0-75-generic #96-Ubuntu SMP Thu Apr 20 09:56:33 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

相关工具语言:vim,gcc,C语言



1.程序源代码

[email protected]:~/operation/1$ cat pflag.c 
#include <unistd.h>
#include <pwd.h>
#include <sys/types.h>
#include <stdio.h>
int main(int argc, char **argv)
{
	pid_t my_pid,parent_pid;
	uid_t my_uid,my_euid;
	gid_t my_gid,my_egid;
	struct passwd *my_info;
	my_pid=getpid();
	parent_pid=getppid();
	my_uid=getuid();
	my_euid=geteuid();
	my_gid=getgid();
	my_egid=getegid();
	my_info=getpwuid(my_uid);
	printf("Process ID:%ld\n",my_pid);
	printf("Parent ID:%ld\n",parent_pid);
	printf("User ID:%ld\n",my_uid);
	printf("Effective User ID:%ld\n",my_euid);
	printf("Group ID:%ld\n",my_gid);
	printf("Effective Group ID:%ld\n",my_egid);
	if(my_info)
	{
		printf("My Login Name:%s\n",my_info->pw_name);
		printf("My Password:%s\n",my_info->pw_passwd);
		printf("My User ID:%ld\n",my_info->pw_uid);
		printf("My Group ID:%ld\n",my_info->pw_gid);
		printf("My Real Name:%s\n",my_info->pw_gecos);
		printf("My Home Dir:%s\n",my_info->pw_dir);
		printf("My Work Shell:%s\n",my_info->pw_shell);
	}
}


2.程序编译与执行

编译:

[email protected]:~/operation/1$ gcc pflag.c -o pflag

编译后会生成pflag程序,执行该程序(为了方便后面的结果分析,执行两次):

[email protected]:~/operation/1$ ./pflag 
Process ID:12628
Parent ID:10136
User ID:1000
Effective User ID:1000
Group ID:1000
Effective Group ID:1000
My Login Name:xpleaf
My Password:x
My User ID:1000
My Group ID:1000
My Real Name:xpleaf,,,
My Home Dir:/home/xpleaf
My Work Shell:/bin/bash
[email protected]:~/operation/1$ 
[email protected]:~/operation/1$ ./pflag 
Process ID:12695
Parent ID:10136
User ID:1000
Effective User ID:1000
Group ID:1000
Effective Group ID:1000
My Login Name:xpleaf
My Password:x
My User ID:1000
My Group ID:1000
My Real Name:xpleaf,,,
My Home Dir:/home/xpleaf
My Work Shell:/bin/bash


3.结果分析

(1)进程标志

因为pflag程序的两次执行都是在同一shell进程下完成的,所以显然输出的Parent ID都是一致的,但是每次程序执行完成后,相应的程序进程也会结束,所以两次程序执行的Process ID都是不一样的。

(2)用户信息

使用了两种方式去获取用户信息,一种是直接取单独的用户信息,如取User ID,直接调用函数库中的函数getuid()函数;而另外一种则是通过创建passwd结构体的实例my_info来直接获取所有的相关用户信息。

分析上面的结果,再与Linux操作系统上的/etc/passwd上本用户的信息进行比对:

[email protected]:~/operation/1$ grep ‘xpleaf‘ /etc/passwd
xpleaf:x:1000:1000:xpleaf,,,:/home/xpleaf:/bin/bash

# 输出依次为
# 用户名:用户密码(不使用,用x代替):用户ID:用户组ID:用户真实姓名:用户家目录:用户shell

可以发现,通过系统调用的方式来获取这些参数,与Linux操作系统/etc/passwd文件记录的信息内容是一致的。



4.参考资料

《操作系统原理与Linux实践教程》P19 实验2Linux程序接口实验

时间: 2024-12-24 09:40:58

Linux程序接口实验:取进程标志及用户信息的相关文章

Linux下用于查看系统当前登录用户信息的4种方法

作为系统管理员,你可能经常会(在某个时候)需要查看系统中有哪些用户正在活动.有些时候,你甚至需要知道他(她)们正在做什么.本文为我们总结了4种查看系统用户信息(通过编号(ID))的方法. 1. 使用w命令查看登录用户正在使用的进程信息 w命令用于显示已经登录系统的用户的名称,以及他们正在做的事.该命令所使用的信息来源于/var/run/utmp文件.w命令输出的信息包括:?用户名称 ?用户的机器名称或tty号 ?远程主机地址 ?用户登录系统的时间 ?空闲时间(作用不大) ?附加到tty(终端)的

Linux显示目前登入系统的用户信息

[email protected]:~$ who youhaidong :0 2015-01-26 22:43 (:0) youhaidong pts/0 2015-01-26 22:45 (:0)

基于Spring oauth2.0统一认证登录,返回自定义用户信息

先看源码是如何处理的:   package org.springframework.boot.autoconfigure.security.oauth2.resource; import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Set; import org.apache.commons.logging.Log

mpvue2.0 支持wx.getUserInfo获取用户信息授权的修改

一.背景 在使用美团的mpvue2.0框架搭建起小程序项目后,做获取用户信息时遇到一些问题:微信小程序更新api后,获取用户信息只能通过button上的绑定方法 来获取用户信息,vue上方法绑定不能直接使用,下面是修改配置mpvue的步骤 vue中代码: <template> <div> <button open-type="getUserInfo" @getuserinfo="bindgetuserinfo">用户授权</

linux试验——SET-UID程序漏洞实验

SET-UID程序漏洞实验 20125121 一.实验描述 Set-UID 是Unix系统中的一个重要的安全机制.当一个Set-UID程序运行的时候,它被假设为具有拥有者的权限.例如,如果程序的拥有者是root,那么任何人运行这个程序时都会获得程序拥有者的权限.Set-UID允许我们做许多很有趣的事情,但是不幸的是,它也是很多坏事情的罪魁祸首. 二.实验内容 2.1 猜测为什么“passwd”,“chsh”,“su”,和“sudo”命令需要Set-UID机制,如果它们没有这些机制的话,会发生什么

linux实验二:SET-UID程序漏洞实验

SET-UID程序漏洞实验 20125113 赵恺 一.实验描述 Set-UID 是Unix系统中的一个重要的安全机制.当一个Set-UID程序运行的时候,它被假设为具有拥有者的权限.例如,如果程序的拥有者是root,那么任何人运行这个程序时都会获得程序拥有者的权限.Set-UID允许我们做许多很有趣的事情,但是不幸的是,它也是很多坏事情的罪魁祸首. 因此本次实验的目标有两点: 1.欣赏好的方面,理解为什么Set-UID是需要的,以及它是如何被执行的. 2.注意坏的方面,理解它潜在的安全性问题.

Linux下的C程序:获取用户信息和主机信息

Linux下获取用户信息和主机信息程序 程序代码: #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <pwd.h> #include <sys/utsname.h> void main() {     printf("当前用户 %s\n", getlogin());     prin

Linux程序包管理及yum安装管理

Linux程序包管理: API:ApplicationProgramming Interface   应用编程接口 POSIX:Portable OS    遵循本协议的程序均可在不同系统间移植 程序编写完成后,执行所要经过的处理步骤: 程序源代码 --> 预处理 --> 编译 --> 汇编 --> 链接 静态编译: 共享编译:直接调用.so共享对象实现 ABI:ApplicationBinary Interface  应用二进制接口 Windows与Linux所支持的可执行二进制

Linux程序包管理与初识磁盘

Linux 程序包管理 API:Application Binary Interface(应用程序的二进制接口) ABI:APPlication Program Inertface(应用程序的开发接口) Windows : exe,msi Windows与Linux不兼容 ELF:(Executale and Linkable Format):可执行可连接格式,linux运行格式 PE:(Portable  Executable)可移植可执格式Windows运行格式 库级别的虚拟化: 要想在Wi