天天看點

系統程式設計(二)

系統程式設計基礎(二)

  • 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檢視程序樹
               

繼續閱讀