系統程式設計基礎(二)
- 1、系統檔案IO和标準檔案IO的差別
标準檔案IO隻讀寫普通檔案和二進制檔案 fread()fwrite()fopen()fclose()fseek() 系統檔案IO還可以讀寫系統裝置檔案 read()write()open()close()lseek() 對于特殊的檔案比如管道,socket隻能用read,write讀寫 标準檔案IO讀寫時使用緩沖區,系統檔案IO不使用緩沖區
- 2、系統檔案IO檔案拷貝
- 3、lseek
- 4、access函數
#include <unistd.h>
int access(const char *pathname, int mode);
/*
pathname檔案名或絕對路徑檔案名
mode:
F_OK判斷檔案是否存在
R_OK是否可讀
W_OK是否可寫
X_OK是否可執行
傳回值成功傳回0,錯誤傳回-1
*/
- 5、檔案屬性
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int stat(const char *path, struct stat *buf);
int fstat(int fd, struct stat *buf);
int lstat(const char *path, struct stat *buf);
傳回值成功傳回,出錯傳回-
struct stat
{
dev_t st_dev; /* ID of device containing file */
ino_t st_ino; /* inode number */
mode_t st_mode; /* protection */ /* 檔案保護模式 */
nlink_t st_nlink; /* number of hard links 硬連結數*/
uid_t st_uid; /* user ID of owner */
gid_t st_gid; /* group ID of owner */
dev_t st_rdev; /* device ID (if special file) */
off_t st_size; /* total size, in bytes 檔案的大小*/
blksize_t st_blksize; /* blocksize for filesystem I/O */
blkcnt_t st_blocks; /* number of 512B blocks allocated */
time_t st_atime; /* time of last access */
time_t st_mtime; /* time of last modification */
time_t st_ctime; /* time of last status change */
};
/*
S_ISREG(m) is it a regular file?是否是普通檔案?
S_ISDIR(m) directory? 目錄?
S_ISCHR(m) character device? 字元裝置?
S_ISBLK(m) block device? 塊裝置?
S_ISFIFO(m) FIFO? 管道?
S_ISLNK(m) symbolic link? 連結檔案?
S_ISSOCK(m) socket? socket?
S_IFMT 0170000 檔案類型的位掩碼
S_IFMT & buf.st_mode
S_IFSOCK 0140000 socket
S_IFLNK 0120000 連結檔案
S_IFREG 0100000 規則檔案
S_IFBLK 0060000 塊裝置檔案
S_IFDIR 0040000 目錄
S_IFCHR 0020000 字元裝置檔案
S_IFIFO 0010000 管道
*/
- 6檔案目錄讀寫函數
//①opendir()
#include <sys/types.h>
#include <dirent.h>
DIR *opendir(const char *name);
//②readdir()
#include <dirent.h>
struct dirent *readdir(DIR *dirp);
struct dirent
{
ino_t d_ino; /* inode number */
off_t d_off; /* not an offset; see NOTES */
unsigned short d_reclen; /* length of this record */
unsigned char d_type; /* type of file; not supported by all filesystem types */
char d_name[]; /* filename */
};
//③closedir()
#include <sys/types.h>
#include <dirent.h>
int closedir(DIR *dirp);
- 7讀取檔案屬性相關的函數
//①getpwuid使用者id
#include <sys/types.h>
#include <pwd.h>
struct passwd *getpwuid(uid_t uid);
char *pw_name;
struct passwd
{
char *pw_name; /* username */
char *pw_passwd; /* user password */
uid_t pw_uid; /* user ID */
gid_t pw_gid; /* group ID */
har *pw_gecos; /* user information */
char *pw_dir; /* home directory */
char *pw_shell; /* shell program */
};
//②getgrgid使用者所屬組id
#include <sys/types.h>
#include <grp.h>
struct group *getgrgid(gid_t gid);
char *gr_name;
struct group
{
char *gr_name; /* group name */
char *gr_passwd; /* group password */
gid_t gr_gid; /* group ID */
char **gr_mem; /* group members */
};
//③localtime
#include <time.h>
struct tm *localtime(const time_t *timep);
struct tm
{
int tm_sec; /* seconds */
int tm_min; /* minutes */
int tm_hour; /* hours */
int tm_mday; /* day of the month */
int tm_mon; /* month */
int tm_year; /* year */
int tm_wday; /* day of the week */
int tm_yday; /* day in the year */
int tm_isdst; /* daylight saving time */
};
//④readlink連結清單的連結的源檔案名
#include <unistd.h>
ssize_t readlink(const char *path, char *buf, size_t bufsiz);
//path連結檔案名
//buf源檔案名
- 8、程序
什麼是程序 程序是系統中配置設定資源的最小機關 檢視程序 ps -aux檢視系統中所有程序 ps -ef檢視目前使用者的程序 ps -efl檢視目前使用者的程序詳情
- 9程序控制塊
程序id 程序隊列 信号量 檔案 記憶體 虛拟記憶體 cpu類型 SMP對稱多處理器 errno
- 10程序狀态
主要的五個狀态:建立 運作 就緒 阻塞 退出 運作時三個狀态:運作 就緒 阻塞 就緒->運作 運作->就緒 運作->阻塞 阻塞->就緒 但是阻塞不能到運作 阻塞需要通過就緒轉化到運作
- 11程序的生成函數fork
#include <unistd.h>
pid_t fork(void);
fork()調用一次有兩個傳回值,父程序傳回的是子
程序的pid,子程序傳回是0,出錯時傳回值小于0
為什麼父程序傳回值是子程序的pid?
因為子程序是父程序生成的,父程序需要管理子程序,
沒有直接擷取子程序的pid函數需要知道子程序的pid号
為什麼子程序傳回值是0?
因為子程序本身的pid可以通過函數getpid()擷取
沒有直接擷取子程序的pid的函數
getpid()//擷取自己的pid号
getppid()//擷取父程序的pid号
- 12、fork生成子程序的過程
fork生成子程序後,子程序是對父程序的完整拷貝 拷貝的資源包括: 代碼,堆棧,檔案描述符,信号量集 如果檔案加鎖檔案鎖是不拷貝的,信号量集拷貝到 子程序後,子程序中的信号量集清空
- 13、vfork函數
vfork函數是先從父程序拷貝能夠運作的最小的資源的集合 寫時拷貝技術:在運作的時候根據程式運作需要的資源,再 從父程序拷貝 vfork函數是先運作子程序,再運作父程序
- 14僵屍程序和孤兒程序
僵屍程序: 對于父子程序,如果子程序先退出,因為子程序是由 是由于子程序是由父程序生成的,父程序中總有子進 程沒有及時給子程序善後那麼,這時的子程序稱為僵 屍程序。 孤兒程序: 對于父子程序,如果父程序先退出了,這時候子程序 init程序的程序号pid是1
- 15、程序的pid
是一個unsigned short型的整數 0~65535 但是我們一般定義取值範圍是0~32767 核心程序的pid是0 init程序的pid是1 pstree檢視程序樹