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
。