who、whoami和who am i

 

先看看这三个命令的输出信息:

[rocrocket@rocrocket ~]$ whoami
rocrocket
[rocrocket@rocrocket ~]$ who am i
rocrocket pts/3        2008-12-30 13:17 (:0.0)
[rocrocket@rocrocket ~]$ who
rocrocket :0           2008-12-30 09:54
rocrocket pts/0        2008-12-30 09:55 (:0.0)
rocrocket pts/1        2008-12-30 09:57 (:0.0)
rocrocket pts/3        2008-12-30 13:17 (:0.0)
当我用sudo su(或者sudo su -)更换到root用户之后,你再看看:

[rocrocket@rocrocket ~]$ sudo su
[root@rocrocket rocrocket]# whoami
root
[root@rocrocket rocrocket]# who am i
rocrocket pts/3        2008-12-30 13:17 (:0.0)
[root@rocrocket rocrocket]# who
rocrocket :0           2008-12-30 09:54
rocrocket pts/0        2008-12-30 09:55 (:0.0)
rocrocket pts/1        2008-12-30 09:57 (:0.0)
rocrocket pts/3        2008-12-30 13:17 (:0.0)

看出区别来了吧,whoami显示的是当前“操作用户”的用户名,而who am i显示的是“登录用户”的用户名。

用Linux的术语来解释就是:(实际用户=uid,即user id。有效用户=euid,即effective user id)

who am i 显示的是实际用户的用户名,即用户登陆的时候的用户ID。此命令相当于who -m。
whoami   显示的是有效用户ID.

好了,明白了两者区别之后,我们来说说who这个命令。

有人会问,为什么我sudo su到root之后,who里面却没有显示呢?

这是因为su过去的用户进程空间是作为一个子空间存在,他并没有得到一个登录的tty。

who这个命令重点是用来查看当前有哪些用户登录到了本台机器上。

who -m的作用和who am i的作用是一样的。

who -q用来显示当前登录用户的个数。

当你觉得who的输出信息晦涩难懂时,可以使用who -H来输出,这样可以在每列加上列名称,有助于阅读。

以下是MMA8452和STM32连接的代码,仅供参考: ```c #include "stm32f10x.h" #include "stdio.h" #define MMA8452_ADDRESS 0x38 #define MMA8452_ID 0x2A #define MMA8452_STATUS 0x00 #define MMA8452_OUT_X_MSB 0x01 #define MMA8452_WHO_AM_I 0x0D #define MMA8452_CTRL_REG1 0x2A #define MMA8452_CTRL_REG1_ACTIVE 0x01 #define I2C_SPEED 100000 #define I2C1_SLAVE_ADDRESS7 0x3F GPIO_InitTypeDef GPIO_InitStructure; void I2C_Configuration(void); void I2C_StartTransmission(I2C_TypeDef* I2Cx, uint8_t transmissionDirection, uint8_t slaveAddress); void I2C_WriteData(I2C_TypeDef* I2Cx, uint8_t data); void I2C_StopTransmission(I2C_TypeDef* I2Cx); uint8_t I2C_ReadAck(I2C_TypeDef* I2Cx); uint8_t I2C_ReadNack(I2C_TypeDef* I2Cx); int main(void) { uint8_t tempData[6]; uint8_t whoAmI; I2C_Configuration(); I2C_StartTransmission(I2C1, I2C_Direction_Transmitter, MMA8452_ADDRESS); I2C_WriteData(I2C1, MMA8452_WHO_AM_I); I2C_StopTransmission(I2C1); I2C_StartTransmission(I2C1, I2C_Direction_Receiver, MMA8452_ADDRESS); whoAmI = I2C_ReadNack(I2C1); I2C_StopTransmission(I2C1); if (whoAmI != MMA8452_ID) { printf("Error: Could not communicate with MMA8452.\n"); while (1) {} } GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); I2C_StartTransmission(I2C1, I2C_Direction_Transmitter, MMA8452_ADDRESS); I2C_WriteData(I2C1, MMA8452_CTRL_REG1); I2C_WriteData(I2C1, MMA8452_CTRL_REG1_ACTIVE); I2C_StopTransmission(I2C1); while (1) { I2C_StartTransmission(I2C1, I2C_Direction_Transmitter, MMA8452_ADDRESS); I2C_WriteData(I2C1, MMA8452_OUT_X_MSB); I2C_StopTransmission(I2C1); I2C_StartTransmission(I2C1, I2C_Direction_Receiver, MMA8452_ADDRESS); tempData[0] = I2C_ReadAck(I2C1); tempData[1] = I2C_ReadAck(I2C1); tempData[2] = I2C_ReadAck(I2C1); tempData[3] = I2C_ReadAck(I2C1); tempData[4] = I2C_ReadAck(I2C1); tempData[5] = I2C_ReadNack(I2C1); I2C_StopTransmission(I2C1); int16_t xData = ((tempData[0] << 8) | tempData[1]) >> 2; int16_t yData = ((tempData[2] << 8) | tempData[3]) >> 2; int16_t zData = ((tempData[4] << 8) | tempData[5]) >> 2; printf("X: %d, Y: %d, Z: %d\n", xData, yData, zData); if (xData > 1000) { GPIO_SetBits(GPIOC, GPIO_Pin_13); } else { GPIO_ResetBits(GPIOC, GPIO_Pin_13); } } } void I2C_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; I2C_InitTypeDef I2C_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); I2C_InitStructure.I2C_Mode = I2C_Mode_I2C; I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2; I2C_InitStructure.I2C_OwnAddress1 = I2C1_SLAVE_ADDRESS7; I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; I2C_InitStructure.I2C_ClockSpeed = I2C_SPEED; I2C_Init(I2C1, &I2C_InitStructure); I2C_Cmd(I2C1, ENABLE); } void I2C_StartTransmission(I2C_TypeDef* I2Cx, uint8_t transmissionDirection, uint8_t slaveAddress) { while(I2C_GetFlagStatus(I2Cx, I2C_FLAG_BUSY)); I2C_GenerateSTART(I2Cx, ENABLE); while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT)); I2C_Send7bitAddress(I2Cx, slaveAddress, transmissionDirection); if (transmissionDirection == I2C_Direction_Transmitter) { while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); } if (transmissionDirection == I2C_Direction_Receiver) { while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)); } } void I2C_WriteData(I2C_TypeDef* I2Cx, uint8_t data) { I2C_SendData(I2Cx, data); while (!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); } void I2C_StopTransmission(I2C_TypeDef* I2Cx) { I2C_GenerateSTOP(I2Cx, ENABLE); } uint8_t I2C_ReadAck(I2C_TypeDef* I2Cx) { I2C_AcknowledgeConfig(I2Cx, ENABLE); while (!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_RECEIVED)); return I2C_ReceiveData(I2Cx); } uint8_t I2C_ReadNack(I2C_TypeDef* I2Cx) { I2C_AcknowledgeConfig(I2Cx, DISABLE); while (!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_RECEIVED)); return I2C_ReceiveData(I2Cx); } ``` 该代码使用STM32的I2C接口与MMA8452进行通信。在主循环中,它从MMA8452读取加速度数据,并根据X轴的值控制PC13引脚的状态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值