首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Linux-c 获取用户主目录和获取随机数功能源代码

Linux-c 获取用户主目录和获取随机数功能源代码

原创
作者头像
tankaro
发布2025-03-21 10:02:09
发布2025-03-21 10:02:09
27100
代码可运行
举报
运行总次数:0
代码可运行
代码语言:c
代码运行次数:0
运行
复制
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

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

#define MAX_USER_HOME_DIR_SIZE      (128)
static char *getUserHomeDir(void);
static int getRandomData(void* buffer, size_t bytes);
static void printHex(char *buffer, int cnt);

int main(int argc, char *argv[])
{
    char *userHomeDir = NULL;
    __uint64_t randomwData = 0;
    char ranmdomBuffer[MAX_USER_HOME_DIR_SIZE] = "";
    printf("=====================start==============\n");
    printf("[%s +%d %s] call getUserHomeDir\n", __FILE__, __LINE__, __func__);
    userHomeDir = getUserHomeDir();
    printf("[%s +%d %s] userHomeDir=%s\n", __FILE__, __LINE__, __func__, userHomeDir);
    printf("[%s +%d %s] sizeof(randomwData)=%ld\n", __FILE__, __LINE__, __func__, sizeof(randomwData));
    getRandomData(&randomwData, sizeof(randomwData));
    printf("[%s +%d %s] randomwData=0x%lx\n", __FILE__, __LINE__, __func__, randomwData);

    printf("[%s +%d %s] sizeof(ranmdomBuffer)=%ld\n", __FILE__, __LINE__, __func__, sizeof(ranmdomBuffer));
    getRandomData(ranmdomBuffer, sizeof(ranmdomBuffer));
    printHex(ranmdomBuffer, sizeof(ranmdomBuffer));
    const char *testString = "Hello, World!";
    printf("字符串 \"%s\" 的十六进制表示为:\n", testString);
    printHex((char *)testString, strlen(testString));
    printf("=====================end==============\n");

    return 0;
}

static char *getUserHomeDir(void)
{
    struct passwd *pwUser = getpwuid(getuid());
    return pwUser == NULL ? NULL : pwUser->pw_dir;
}

/* get any bytes of random data from /dev/urandom, return 0 if it succeeds; else
 * return -1 */
static int getRandomData(void* buffer, size_t bytes)
{
    int ret = 0;
    if (bytes > 0) {
      const size_t one = 1UL;
      FILE* fp = fopen("/dev/urandom", "r");
      if (buffer == NULL || fp == NULL || fread(buffer, bytes, one, fp) != one)
      {
        ret = -1;
      }
      if (fp)
      {
        fclose(fp);
        fp = NULL;
      }
    }
    return ret;
}

static void printHex(char *buffer, int cnt)
{
    for (int i = 0; i < cnt; ++i)
    {
        printf("%02x ", (unsigned char)(buffer[i]));
    }
    printf("\n");
}

源代码运行结果:

代码语言:shell
复制
=====================start==============
[userdir_urandom.c +20 main] call getUserHomeDir
[userdir_urandom.c +22 main] userHomeDir=/home/twc
[userdir_urandom.c +23 main] sizeof(randomwData)=8
[userdir_urandom.c +25 main] randomwData=0x7b3a0cdb1620e43c
[userdir_urandom.c +27 main] sizeof(ranmdomBuffer)=128
42 da af 94 2d c8 8e 65 9f 93 d8 82 66 d9 c9 7a 01 2e 26 74 2a b0 57 a5 9e d9 44 b2 d6 28 ef 4d 0f fd b9 70 ce be 20 6f 58 84 cd 87 e5 57 45 3c 55 90 1d ae 39 ec a4 fd 63 29 0d 19 7c f5 23 4a e4 75 8e 0a 12 4c 28 28 1a 81 59 6f de 43 1f 64 ab 02 73 98 fa e0 82 5e f1 bd c1 c1 a4 cb 17 1c 07 f0 b6 73 80 e5 1b b4 fb af 2b 81 a9 7d 85 00 bd 14 3c 0d 02 f1 66 5f 6c a3 f1 d4 b6 3e 75 f3
字符串 "Hello, World!" 的十六进制表示为:
48 65 6c 6c 6f 2c 20 57 6f 72 6c 64 21
=====================end==============

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档