目录操作(2)(21)

news2024/11/12 11:20:51

1.getpwuid

struct passwd *getpwuid(uid_t uid);

功能:

根据用户id到k's文件下解析获得

结构体信息

参数:

uid:用户id

返回值:

成功返回id对应用户的信息

失败返回NULL

eg:接受返回值struct passwd * pw = getpwuid(uid);

struct passwd {
    char *pw_name;    /* 用户名 */
    char *pw_passwd;  /* 密码(通常为空,因为密码已经被加密存储在其他地方) */
    uid_t pw_uid;     /* 用户的 UID */
    gid_t pw_gid;     /* 用户的 GID */
    char *pw_gecos;   /* 用户信息(通常是全名或其他描述) */
    char *pw_dir;     /* 用户的主目录 */
    char *pw_shell;   /* 用户的默认 shell */
};
#include <sys/types.h>
       #include <pwd.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
    uid_t uid = 1000;
    struct passwd * pw = getpwuid(uid);
    if(NULL== pw)
    {
        fprintf(stderr,"getpwuid error\n");
        return 1;
    }
    printf("name:%s gid:%d info:%s dir:%s shell:%s\n",pw->pw_name,pw->pw_gid,pw->pw_gecos
           ,pw->pw_dir,pw->pw_shell);
    return 0;
}

2.getpwnam

函数原型

getpwnam 的函数原型定义在头文件 <pwd.h> 中,如下所示:

 

c #include <pwd.h>struct passwd *getpwnam(const char *name);

参数

  • name: 指向以 null 结尾的字符串,表示要查找的用户名。

返回值

  • 成功时,getpwnam 返回一个指向 passwd 结构的指针,该结构包含用户的相关信息。

  • 如果用户名不存在或发生错误,则返回 NULL

它与 getpwuid 函数的区别在于, getpwuid 是通过用户 ID 来获取用户信息,而 getpwnam 是通过用户名来获取。

在实际编程中,使用这两个函数时,需要注意对返回值进行判断,以处理未找到对应信息的情况。

3.getgrgid

struct group *getgrgid(gid_t gid);

功能:

根据gid到/etc/group文件中解析组信息

参数:

gid:组id

返回值:

成功返回组信息

失败返回NULL

软链接文件、符号链接文件

硬链接文件

命令行:ln -s 123 softlink 快捷方式

struct group {
    char *gr_name;    // 组名
    char *gr_passwd;  // 组密码(通常为空,因为组密码通常不使用)
    gid_t gr_gid;     // 组 ID
    char **gr_mem;    // 组成员列表(指向用户名数组)
};

常用命令函数

1.symlink

int symlink(const char *oldpath, const char *newpath);

功能:

创建一个链接向oldpath文件的新符号链接文件

软连接,快捷方式删除不影响源文件,源文件删除软链接失效(类似于在桌面创建一个快捷方式)

参数:

oldpath:被链接向的文件的路径

newpath:新符号链接文件

返回值:

成功返回0

失败返回-1

在linux中创建软链接命令为ln -s

语法为 ln -s 源文件或目录 软链接名称

#include <stdio.h>
#include <unistd.h>
// ln -s  123 softlink 

int main(int argc, char *argv[])
{
    int ret = symlink("/home/linux/1.png","softlink");
    if(-1 == ret)
    {
        fprintf(stderr,"symlink error\n");
        return 1;
    }

    return 0;
}

2.remove rm -fr

int remove(const char *pathname);

功能:

删除一个文件

参数:

pathname:删除文件的路径

返回值:

成功返回0

失败返回-1

3.rename //mv rename

int rename(const char *oldpath, const char *newpath);

功能:

将一个老的路径名改为新的路径

参数:

oldpath:老路径名

newpath:新路径名

返回值:

成功返回0

失败返回-1

#include <stdio.h>
int main(int argc, char *argv[])
{
    
    int ret = rename("./aaa","./bbb"); 
    if(-1 ==ret)
    {
        fprintf(stderr,"rename error\n");
        return 1;
    }
    return 0;
}

4.link ln 1 2

int link(const char *oldpath, const char *newpath);

功能:

创建一个硬链接文件(只能链接文件不能链接目录)

删除哪一个都不影响

参数:

oldpath:要链接向的文件

newpath:创建的新硬链接文件

返回值:

成功返回0

失败返回-1

5.truncate

修改一个已存在文件大小

#include <unistd.h>

int truncate(const char *path, off_t length);

eg:

int ret = truncate("bigfile",1024*1024*1024);

修改一个文件的大小到1G


#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main(int argc, char *argv[])
{
    fopen("bigfile","w");
    int ret = truncate("bigfile",1024*1024*1024);    
    if(-1 == ret)
    {
        fprintf(stderr,"truncate error\n");
        perror("truncate");
        return 1;
    }
    return 0;
}

相关报错函数

errno

errno是一个出错码,在#include <errno.h> //extern int errno里面声明

很多函数再出错的时候都会将errno置为一个数,c语言有大概一百多个错误

1.perror

void perror(const char *s);-->strerror() stderr

打印出字符串之后,在之后继续打出errno对应的错误信息

功能:

打印s字符串和errno对应的错误信息

参数:

s:要打印在终端上的出错信息

返回值:

缺省

eg:

#include <stdio.h>

int main(int argc, char *argv[])
{
    FILE* fp = fopen("aaa","r");//打开失败,errno获得一个错误码
    if(NULL == fp)
    {
        perror("fopen");//会返回errno对应的错误
        return 1;
    
    }
    return 0;
}

2.strerror

char *strerror(int errnum);

功能:

打印errnum出错码对应的出错信息

参数:

errnum:出错errno号

返回值:

成功返回对应的错误信息

ruturn 1;

可以使用以下代码打印出c语言对应的错误信息

#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
    int i =0 ;
    for(i=0;i<256;i++)
    {
        printf("%d %s\n",i,strerror(i));
    }
    
    return 0;
}

3.error ===>>>exit();

void error(int status, int errnum, const char *format, ...);

功能:

程序出错打印对应出错原因和用户输入字符串并退出

参数:

status:程序退出的状态(大概对应return)

EXIT_FAILURE 1 EXIT_SUCCESS 0 errnum:错误码

format:

类似printf打印

返回值:

缺省

__FILE__ 表示所在的文件名

__LINE__表示第几行

__func__表示在那个函数

__DATE__日期

__TIME__时间

c 内置宏不需要头文件既可使用

#include <stdio.h>
#include <error.h>
#include <errno.h> //extern int errno
int main(int argc, char *argv[])
{
    FILE* fp = fopen("aaa","r");    
    if(NULL == fp)
    {
        //perror("fopen");
        error(1,errno,"fopen,file:%s fun:%s line:%d",__FILE__,__func__,__LINE__);
        printf("aaaa\n");
        return 1;
    
    }
    return 0;
}

Makefile 编写 工程管理工具

vim 编辑器,gcc 编译器 ,gdb 调试器 make

Gdb -->gnu debug

make文件的两种写法Makefile makefile

Makefile一共有三种写法,一般常用下面这种

SRC = main.c 
SRC += add.c
SRC += mul.c 
OBJ = all
#自定义的变量flag 
FALG = -g 
LIB = -lm
CC = gcc 
$(OBJ):$(SRC)
        $(CC) $(SRC) -o $(OBJ) $(FLAG) $(LIB)

clean:
        rm $(OBJ)

另外两种写法

all:main.c add.c mul.c
        gcc $^ -o $@

clean:
        rm all
        
all:main.c add.c mul.c
        gcc main.c add.c mul.c -o all

clean:
        rm all

gdb

GDB(GNU Debugger)是一个强大的命令行调试工具,常用于调试 C、C++ 等程序。

它允许您在程序运行时查看变量的值、设置断点、单步执行代码、查看调用栈等,以帮助您找出程序中的错误和问题。

1.找段错误

(1)gcc -g *.c 加上调试选项-g

(2)gdb a.out调试可执行文件

(3)按r(run)直接开始运行

(4)重现段错误

(5)where 找出段错误的位置

-->l *.c:10//l加上文件名冒号行号

按q退出

2.一般错误

(1)gcc -g -lpthread 1.c

(2)gdb a.out

(3)b fun.c:36 设置断点,运行到这个位置,程序自动暂停

(4)r运行

(5)n执行下一步

(6)使用p命令,查看变量或指针等数据

strtok函数

strtok 是一个用于分割字符串的标准库函数,其原型如下:

#include <string.h>

char *strtok(char *str, const char *delim);

函数参数

  • str: 要分割的字符串。第一次调用时提供字符串,后续调用时传递 NULL。因为strtok函数里有静态指针,记录了上一次的读写位置

  • delim: 字符串中的分隔符字符集合。

返回值

  • 成功时,返回指向下一个分割子字符串的指针。

  • 如果没有更多的分割子字符串,返回 NULL

功能

  • strtok 使用 delim 中的字符作为分隔符,将 str 分割成若干个子字符串。

  • 每次调用 strtok 时返回下一个子字符串,直到所有子字符串都被处理完。

eg:

#include <stdio.h>
#include <string.h>

int main() {
    char str[] = "Hello,world,this,is,a,test";
    const char *delim = ",";

    char *token = strtok(str, delim);
    while (token != NULL) {
        printf("%s\n", token);
        token = strtok(NULL, delim);
    }

    return 0;
}
  • strtok 修改原始字符串,将分隔符替换为 \0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2053613.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Servlet---axios框架 ▎路由守卫

前言 在现代Web应用中&#xff0c;前端和后端通常分离&#xff0c;前端使用框架&#xff08;如Vue.js、React&#xff09;与后端服务交互。Servlet是Java EE中处理HTTP请求的重要组成部分&#xff0c;能够生成动态Web内容。 Axios是一个基于Promise的HTTP客户端&#xff0c;简…

【layUI】只能选某个特定区间的日历

要实现的功能如下&#xff1a;业务要求让日历只有近3天可选&#xff0c;其它部分变灰且不可选。 代码实现 在html中加入如下代码&#xff1a; <label class"layui-form-label" style"">日期&#xff1a; </label> <div class"layu…

二、前后端分离通用权限系统(2)

&#x1f33b;&#x1f33b; 目录 一、 Mybatis-Plus 复习1.1、简介1.2、特点1.3、支持数据库1.4、在工程中引入依赖 二、Mybatis-Plus 入门2.1、导入配置文件2.2、导入启动类2.3、实体类2.4、创建 Mapper 类2.5、创建测试 Mapper接口2.6、CRUD 测试2.6.1、insert 添加2.6.2、主…

flink环境搭建

Flink会话模式 1.集群规划&#xff1a; 2. 将flink拖到/opt/so下 3. 将安装包解压到/opt/module下&#xff1a; tar -zxvf /opt/so/flink-1.15.4-bin-scala_2.12.tgz -C /opt/module 4. 改个名&#xff1a;mv flink-1.15.4 flink 5. 修改配置文件&#xff1a;cd /opt/mo…

CPU 绑核

随笔记录 目录 1. 背景介绍 2. 查询设备CPU 中断核 2.1 查询设备名 2.2 查询设备CPU 中断核 2.2.1 查询本服务上所有设备 CPU 中断核Number 2.2.2 查询 每个设备cpu 中断核的 3. 确定可绑定CPU 核 3.1 查询cpu 信息 3.2 绑核 3.3 更新group 3.4 重启后查看 4. 绑核…

9 算术、关系、逻辑、赋值、位操作、三元运算符及其优先级

目录​​​​​​​ 1 运算符基础 1.1 什么是运算符 1.2 什么是表达式 1.3 左操作数和右操作数 1.4 运算符分类 1.4.1 按照操作数个数分类 1.4.2 按照功能分类 1.5 如何掌握运算符 2 算术运算符 2.1 正号和负号 2.2 加、减、乘、除 2.3 取模&#xff08;取余&#…

Java八股整合(MySQL+Redis+Maven)

MySQL 数据库设计三范式 不可再分&#xff0c;部分依赖&#xff0c;传递依赖 主键和外键区别 主键非空约束&#xff0c;唯一性约束&#xff0c;唯一标识一个字段 外键用于和其他表建立连接&#xff0c;是另一张表的主键&#xff0c;可重复可为空可以有多个 为什么不推荐使…

记录一次生产jvm问题的排查

记录一次生产问题的排查 第一天晚上 现象 1、前援反馈页面有接口陆续出现请求超时 2、登录后台服务器top命令查看发现java进程发生高cpu占用情况 3、查看对应业务日志&#xff0c;报数据库连接等待超时-数据库连接池连接无空闲 对应处理 1、临时调大数据库连接池最大连接数限…

如何发布自己的NPM包详细步骤

前言 在前端开发中&#xff0c;将自己编写的 Vue 组件或插件打包并发布到 NPM 上&#xff0c;不仅可以方便自己在其他项目中复用&#xff0c;还能分享给更多的开发者使用。本文将从 NPM 注册、登录与发布流程&#xff0c;及如何通过 Vue CLI 打包插件的角度详细介绍如何发布 V…

C#线程的使用

每个正在操作系统上运行的应用程序都是一个进程&#xff0c;一个进程可以包括一个或多个线程。线程是操作系统分配处理器时间的基本单元&#xff0c;在进程中可以有多个线程同时执行代码。 1、单线程 单线程就是只有一个线程。默认情况下&#xff0c;系统为应用程序分配一个主…

论团体标准的有效期

在当今快速发展的社会中&#xff0c;标准对于规范行业秩序、保障产品和服务质量起着至关重要的作用。其中&#xff0c;团体标准作为标准体系的重要组成部分&#xff0c;以其灵活性和专业性受到了广泛的关注。而团体标准的有效期&#xff0c;则是一个值得深入探讨的重要议题。 团…

2024年最新上榜的文件加密管理软件

文件加密市场风起云涌&#xff0c;后辈迭出&#xff0c;2024年安企神软件在文件加密管理软件市场中备受瞩目&#xff0c;凭借其强大的功能和全面的保护策略&#xff0c;成功上榜并受到广泛认可。以下是对它的详细介绍&#xff1a; 一、产品概述 安企神软件不仅是一款电脑监控…

“软件定义汽车”下的软件虚拟化技术

01.虚拟化技术概述 近年来&#xff0c;随着嵌入式软硬件的高速发展&#xff0c;嵌入式系统产品已融入日常生活的方方面面&#xff0c;在航空航天、车载电子、工业控制等要求更为严苛等领域的应用也更加广泛。特别对汽车领域&#xff0c;每辆车内ECU的使用数量已从21世纪初的30…

定时任务调度`crond` 和 `at` 命令使用

&#x1f600;前言 本篇博文是关于 linux实操篇-定时任务调度crond 和 at 命令&#xff0c;希望你能够喜欢 &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以帮助到大家&#xff0c;您的满…

【心酸报错】ImportError: failed to find libmagic. Check your installation

目录 报错信息&#xff1a;ImportError: failed to find libmagic. Check your installation按照网络上找的办法修改还是报错&#xff1a;LookupError:Resource punkt not found.下载nltk_data又报错&#xff1a;AttributeError: tuple object has no attribute page_content怀…

软件工程概述(下)

4、软件工程原理 &#xff08;1&#xff09;什么是软件工程&#xff1f; 软件工程是指导计算机软件开发和维护的一门学科。 采用工程的概念、原理、技术和方法来开发与维护软件&#xff0c;把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来&#xf…

【Qt】常用控件QCheckBox

常用控件QCheckBox QCheckBox表示复选按钮&#xff0c;可以允许选中多个。 QCheckBox继承自QAbstractButton 例子&#xff1a;获取复选按钮的取值 使用Qt Designer先大体进行设计 代码实现&#xff1a; #include "widget.h" #include "ui_widget.h"Widge…

【数学建模】趣味数模问题——舰艇追击问题

问题描述 某缉私舰位于走私船以东 d 10 km&#xff0c;走私船以匀速 u 8 km/h 向北沿直线行驶。缉私舰立即以速度 v 12 km/h 追赶。缉私舰使用雷达进行跟踪&#xff0c;保持瞬时速度方向始终指向走私船。求解缉私舰的追逐路线和追上走私船所需的时间。 方法 理论求解&…

阿里巴巴拍立淘API返回值:商品搜索与社交媒体的融合

阿里巴巴拍立淘API返回值在商品搜索与社交媒体融合方面展现出了巨大的潜力和价值。以下是对这一主题的详细分析&#xff1a; 一、拍立淘API在商品搜索中的应用 1. 技术原理 拍立淘API基于图像识别技术&#xff0c;利用深度学习算法对上传的图片进行智能分析&#xff0c;快速…

WebSocket协议解析与Java实践

文章目录 一、HTTP协议与HTTPS协议1.HTTP协议的用处2.HTTP协议的特点3.HTTP协议的工作流程4.HTTPS协议的用处5.HTTPS协议的特点6.HTTPS协议的工作流程 二、WebSocket协议出现的原因1. 传统的HTTP请求-响应模型2. 轮询&#xff08;Polling&#xff09;3. 长轮询&#xff08;Long…