Ŀ¼
- 进程调度 - 内存管理 - 提供文件系统 - 创建和终止进程 - 设备访问 - 联网 - 提供系统调用应用编程接口(API)
/* 由:分隔,分别对应结构中对应的字段 * root:x:0:0:root:/root:/usr/bin/zsh */ struct passwd { char *pw_name; //Login name char *pw_passwd; //Encrypted password uid_t pw_uid; //User Id gid_t pw_gid; //Group Id char *pw_gecos; //@Deprecated char *pw_dir; //Initial working directory char *pw_shell; //Login shell };
#include <pwd.h> struct passwd *getpwnam(const char *name); struct passwd *getpwid(uid_t uid); /* 扫描/etc/passwd文件 */ struct passwd *getpwent(void); void setpwent(void); //设置指针到开头 void endpwent(void); //扫描完成关闭文件
/* 由:分隔,分别对应结构中对应的字段 * adm:x:4:syslog */ struct group { char *gr_name; //Group name char *gr_passwd; //Encrypted password gid_t gr_gid; //Group Id char **gr_men; //Members list };
#include <grp.h> struct group *getgrnam(const char *name); struct group *getgrgid(gid_t gid); /* 扫描/etc/group文件 */ struct group *getgrent(void); void setgrent(void); //设置指针到开头 void endgrent(void); //扫描完成关闭文件
/* 由:分隔,分别对应结构中对应的字段 * root:*:17737:0:99999:7::: */ struct spwd { char *sp_name; //Login name char *sp_pwdp; //Encrypted password ... };
#include <shadow.h> struct spwd *getspnam(const char *name); /* 扫描/etc/shadow文件 */ struct group *getspent(void); void setspent(void); //设置指针到开头 void endspent(void); //扫描完成关闭文件
#define _XOPEN_SOURCE #include <unistd.h> char *crypt(const char *key, const char *salt);
... struct *wpd = getpwnam(username); struct *spwd = getspnam(username); if (spwd != NULL) wpd->pw_passwd = spwd->sp_pwdp; char *password = getpass("Password:"); char *encrypted = crypt(password, pwd->pw_passwd); ... //clear password and validity check Boolean authOk = strcmp(encrypted, pwd->pw_passwd) == 0; if (authOk) //success
struct stat { dev_t st_dev; ino_t st_ino; mode_t st_mode; //File type and permissions nlink_t st_nlinke; uid_t st_uid; //User ID of file owner gid_t st_gid; //Group ID of file owner dev_t st_rdev; off_t st_size; //Total file size (bytes) ... };
- 打开一个文件:open()
#include <sys/stat.h> #include <fcntl.h> int open(const char *pathname, int flags, .../* mode_t mode */);
标志 | 用途 |
---|---|
O_RDONLY | 以只读方式打开 |
O_WRONLY | 以只写方式打开 |
O_RDWR | 以读写方式打开 |
O_CREAT | 若文件不存在则创建之 |
O_DIRECTORY | 若pathname不是目录,则失败 |
O_EXCL | 与O_CREAT一起,如果文件已存在就不打开文件,返回错误EEXIST |
O_LARGEFILE | 在32位系统中使用此标志打开大文件 |
O_APPEND | 总在文件尾部追加数据 |
O_TRUNC | 如果文件已经存在且为普通文件,那么清空文件内容,长度置为0 |
... ... |
创建一个文件:creat()
#include <fcntl.h> int creat(const char *pathname, mode_t mode);
数据写入文件:write()
#include <unistd.h> ssize_t write(int fd, void *buffer, size_t count);
关闭文件:write()
#include <unistd.h> int close(int fd);
改变文件偏移量
#include <unistd.h> off_t lseek(int fd, off_t offset, int whence);
标志 | 用途 |
---|---|
SEEK_SET | 从文件头部起始点开始偏移 |
SEEK_CUR | 从当前文件偏移量开始偏移 |
SEEK_END | 从文件尾部开始偏移 |
I/O控制方法:ioctl()
#include <sys/ioctl.h> int ioctl(int fd, int request, .../* argp */);
- 文本:程序的指令 - 数据:程序使用的静态变量 - 堆:程序可从该区域动态分配额外内存 - 栈:随函数调用、返回而增减的一片内存,用于局部变量和函数调用链接信息分配存储空间
#include <sys/ioctl.h> pid_t getpid(void); pid_t getppid(void);
文件 | 描述 |
---|---|
cmdline | 以\0分隔的命令行参数 |
cwd | 指向当前工作目录的符号链接 |
Environ | 环境信息,以\0分隔 |
exe | 指向正在执行文件的符号链接 |
fd | 指向由进程打开的文件的符号链接 |
maps | 内存映射 |
men | 进程虚拟内存 |
root | 指向根目录的符号链接 |
status | 进程状态信息(进程ID、凭证、内存使用量、信号等) |
task | 为进程中的每个线程均包含一个子目录 |