• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 200, comments - 8, trackbacks - 0, articles - 0

            linux高級編程day03 筆記(轉)

            Posted on 2012-12-30 16:39 鑫龍 閱讀(469) 評論(0)  編輯 收藏 引用 所屬分類: 楊強linux視頻筆記系列

            一、make與makefile
              1.回顧:
                目標的語法
                目標名:依賴目標
                  @命令
                  @命令
                  
                make的命令行使用
                  make -f make腳本文件  目標名
              2.目標的劃分
                目標依賴

              3.默認規則:
                a.不指定目標,執行第一個目標
                b.不指定make文件,默認文件是makefile Makefile
                  makefile優先
              4.目標的調用規則:(make把目標當成當前文件夾下同名的文件)
                make執行目標:
                  搜索與目標相同的文件
                  如果文件存在,則判定文件是否被修改過。
                  文件未被修改,則停止執行,輸出提示
                  文件修改過,則進行執行。(文件不存在屬于被修改過范疇)

                  比較:當前目標與依賴目標
              5.建議:
                只要有文件輸出,就把任務作為一個目標,并且把輸出的文件作為目標名。
                范例:
                input.o:input.c
                   gcc -c -fpic input.c
                libdemo.so:input.o
                   gcc -shared -olibdemo.so input.o
                demo:libdemo.so demo.c
                   gcc demo.c -ldemo -L. -odemo
              
              6.潛規則(不建議)
                適用于:.c目標與.o目標。
                查找.o目標,目標不存在,就把.o替換成.c
                如果.c存在,實施潛規則:直接調用gcc把.c執為.o
              7.變量
                變量名=值 值
                
                $(變量名)  ${變量}  
              8.偽目標:
                不把目標作為文件處理的目標稱為偽目標
                聲明偽目標
                .PHONY=目標  

            二、環境變量
              1.使用main的參數
              int main(int args,char *argv[],char **arge)
              {
              }
              命令行參數argv與環境行arge都是字符串數組.
              約定:最后一個字符串是NULL/0
              2.在C的標準庫提供:外部變量
               extern char **environ;


            #include <stdio.h>
            #include <unistd.h>
            extern char **environ;
            int main(/*int args,char *argv[],char*arge[]*/)
            {
                /*
                while(*arge)
                {
                    printf("%s\n",*arge);
                    arge++;
                }
                
            */
                /*
                int i=0;
                while(arge[i])
                {
                    printf("%s\n",arge[i]);
                    i++;
                }
                
            */
                while(*environ)
                {
                    printf("%s\n",*environ);
                    environ++;
                }
            }

            3.修改獲取某個環境變量
                getenv/setenv/unsetenv

            #include <stdlib.h>
            #include <stdio.h>
            main()
            {
                char *val;
                val=getenv("PATH");
                printf("%s\n",val);
            }
            三、IO的基礎
              1.認識內核對象
                不允許訪問內核設備和內存,但可以通過內核系統函數去訪問.
                對每個內核對象進行編號ID.
                如果訪問內核對象,只能通過ID.
                編程模型:
                  申請得到一個ID
                  在內核系統函數中使用ID得到對應內核對象數據
              2.怎么訪問文件
                使用函數,傳遞一個文件,系統打開文件,加載文件數據,
                返回一個ID.
                使用函數,傳遞ID,得到數據.
                使用函數傳遞ID,告訴系統釋放文件.
                    
                ID:文件描述符號.file description (fd)
                
                每個程序執行的時候都有一個目錄,存放打開的文件描述符號
              3.每個程序默認打開三個文件設備:
                0:標準輸入
                1:標準輸出
                2:錯誤輸出
              4.操作文件描述符號
                ssize_t write(int fd,
                 void *buf,//要寫入內核對象的數據
                 size_t size);//寫入數據大小
                返回:
                  >0 實際寫入的數據
                  -1 寫入錯誤 
                ssize_t read(int fd,
                  void *buf,//返回數據的空間
                  size_t size);//空間大小
                返回:
                  >0:實際讀取的數據
                  =0:碰到文件結束符號EOF (ctrl+d)
                  -1:讀取錯誤
                
                建議:
                  0:輸入
                  1:輸出
                  2:錯誤輸出
            課堂練習:
              1.使用write向0 1 2 寫數據
              2.使用read從0 1 讀取數據,并判定輸入的情況,然后根據相應的結果輸出提示

            #include <stdlib.h>
            #include <stdio.h>
            main()
            {
                //printf("%d\n",getpid());
                
            //while(1);
                /*
                int r=write(0,"Hello\n",6);
                write(1,"world\n",6);
                write(2,"louis\n",6);
                int a=20;
                
                write(1,&a,4);
                
            */
                char buf[32];
                //memset(buf,0,32);
                bzero(buf,32);
                
                int r=read(0,buf,30);
                printf("實際輸入:%d\n",r);
                if(r>0)
                {
                    buf[r]=0;
                    printf("::%s\n",buf);
                }
                if(r==0)
                {
                    printf("ctrl+d\n");
                }
                if(r==-1)
                {
                    printf("輸入錯誤!\n");
                }
            }

            三.基于文件的描述符號
              1.得到文件描述符號/釋放文件描述符號
               a.文件類型
                目錄文件d
                普通文件f
                字符設備文件c
                塊設備文件b
                軟連接文件l
                管道文件p
                socket文件s   
               b.文件的屬性
                 1.屬性的表達方式:絕對模式(0666類似的八進制數),字符模式(rwx)
                   0    0   0    0
                      擁有者   組   其他用戶
                   0666
                 2.文件的權限屬性:
                   讀
                   寫
                   執行
                   粘附位權限
                   用戶設置位權限
                   組設置位權限
                  0   0         0      0       0
                    特殊權限   Owner  group  其他用戶

                   s:
                   S
                   t
                   T
                  2.1.  s設置位
                      2:組設置位
                      4:用戶設置位
                     s對執行有效
                     無效的設置位使用S表示
                     
                     設置位向其他用戶開放擁有者權限的權限.用戶設置位
                     設置位向其他用戶開放組用戶權限的權限.組用戶設置位
                     設置位只對執行程序有意義(執行權限有意義)
                     
                  2.2.  t設置位
                      1:表示沾附位設置
                      t對寫文件有意義
                     沒有執行權限的沾附位使用T表示.
                     沾附的目的:防止有些權限的用戶刪除文件.
                  
                  程序在執行的時候到底擁有的是執行者用戶的權限
                  還是文件擁有者的權限.(看setUID)
                   程序執行中有兩個用戶:
                      實際用戶:標示進程到底是誰
                      有效用戶:標示進程訪問資源的權限
                   上述一般情況是一樣的,有時候被setUID改變      
               總結:
                 沾附位的作用: 防止其他有寫權限用戶刪除文件
                 設置位的作用: 向其他執行者開發組或者用戶的權限.
            練習:
              1.使用cat創建一個文件
              2.設置沾附位,并觀察屬性
              3.設置用戶設置位, 并觀察屬性
              4.設置組設置位, 并觀察屬性
              5.考慮w權限與沾附位的關系
              6.考慮x權限與設置位的關系.

              2.通過文件描述符號讀寫各種數據.      
                open函數與creat函數

             int open(
                                const char *filename,//文件名
                                int flags,//open的方式[創建/打開]
                                mode_t mode//權限(只有創建的時候有效)
                                )

             返回:
                  >=0:內核文件描述符號.
                  =-1:打開/創建失敗
              
                open的方式:
                  必選方式:O_RDONLY O_WRONLY O_RDWR,必須選擇一個
                  創建/打開:O_CREAT
                  可選方式:
                      對打開可選方式:O_APPEND  O_TRUNC(清空數據)
                      對創建可選方式:O_EXCL
                 組合:
                    創建:
                      O_RDWR|O_CREAT
                      O_RDWR|O_CREAT | O_EXCL 
                    
                    打開:          
                      O_RDWR
                      O_RDWR|O_APPEND
                      O_RDWR|O_TRUNC
                 權限:
                   建議使用8進制數
                關閉 
                void  close(int fd);           

            案例1:
              創建文件
            案例2:
              創建文件并寫入數據
                20  short float
                tom  20   99.99
                bush  70   65.00
                達內  40   100.00
              注意:
                文件的創建的權限受系統的權限屏蔽的影響
                umask    //顯示屏蔽權限.
                umask 0666  //設置權限屏蔽.   
                
                ulimit -a 顯示所有的其他限制. 


            /*創建文件*/
            #include <fcntl.h>
            #include <stdio.h>
            #include <stdlib.h>
            #include <string.h>
            main()
            {
                int fd;
                
                char name[20];
                short age;
                float score;
                char sex;
                
                fd=open("test.dat",
                    O_RDWR|O_CREAT|O_EXCL,
            );
                if(fd==-1) printf("open error:%m\n"),exit(-1);
                
                
                //寫第一條
                memcpy(name,"tom",strlen("tom")+1);
                age=20;
                score=99.99;
                sex='F';
                
                write(fd,name,sizeof(name));
                write(fd,&age,sizeof age);
                write(fd,&score,sizeof(float));
                write(fd,&sex,sizeof(sex));
                
                //寫第二條
                memcpy(name,"Bush",strlen("Bush")+1);
                age=70;
                score=65.00;
                sex='M';
                write(fd,name,sizeof(name));
                write(fd,&age,sizeof age);
                write(fd,&score,sizeof(float));
                write(fd,&sex,sizeof(sex));
                
                //寫第三條
                
                memcpy(name,"達內",strlen("達內")+1);
                age=10;
                score=99.00;
                sex='F';
                write(fd,name,sizeof(name));
                write(fd,&age,sizeof age);
                write(fd,&score,sizeof(float));
                write(fd,&sex,sizeof(sex));
                    
                close(fd);
            }
            案例3:
              打開文件讀取數據
              重點:
                怎么打開讀取
                文件尾的判定
              
              基本類型的數據讀寫.
            #include <fcntl.h>
            #include <stdlib.h>
            #include <unistd.h>
            #include <stdio.h>

            main()
            {
                char name[20];
                short age;
                float score;
                char sex;
                int fd;
                int r;
                fd=open("test.dat",O_RDONLY);
                if(fd==-1) printf("open error:%m\n"),exit(-1);
                
                while(1)
                {
                    r=read(fd,name,sizeof(name));
                    if(r==0) break;
                    r=read(fd,&age,sizeof(short));
                    r=read(fd,&score,sizeof(float));
                    r=read(fd,&sex,sizeof(sex));
                    printf("%s,\t%4hd,\t%.2f,\t%1c\n",
                            name,age,score,sex);
                }
                
                close(fd);
            }
            案例4:
              結構體讀取
              描述:從鍵盤讀取若干條數據,保存到文件
                 數據追加
            View Code 

            #include <stdio.h>
            #include <unistd.h>
            #include <fcntl.h>
            #include <stdlib.h>
            #include <string.h>
            struct stu
            {
                int no;
                char name[20];
                float score;
            };
            /*
            .判定文件是否存在,存在打開,不存在創建
            .輸入記錄
            .保存記錄
            .提示繼續輸入
            .繼續/不繼續
            .關閉文件
            */
            int openfile(const char *filename)
            {
                int fd;
                fd=open(filename,O_RDWR|O_CREAT|O_EXCL,0666);
                if(fd==-1)//表示文件存在,則打開
                {
                    fd=open(filename,O_RDWR|O_APPEND);
                    return fd;
                }
                return fd;
            }
            void input(struct stu *record)
            {
                bzero(record,sizeof(struct stu));
                printf("輸入學號:");
                scanf("%d",&(record->no));
                printf("輸入姓名:");
                scanf("%s",record->name);
                printf("輸入成績:");
                scanf("%f",&(record->score));
            }
            void save(int fd,struct stu *record)
            {
                write(fd,record,sizeof(struct stu));
            }
            int iscontinue()
            {
                char c;
                printf("是否繼續輸入:\n");
                //fflush(stdin);
                
            //fflush(stdout);
                scanf("\n%c",&c);    
                if(c=='Y' || c=='y')
                {
                    return 1;
                }
                return 0;
            }

            int main()
            {
                int fd;
                int r;
                struct stu s={0};
                fd=openfile("stu.dat");
                if(fd==-1) printf("openfile:%m\n"),exit(-1);
                
                while(1)
                {
                    input(&s);
                    save(fd,&s);
                    r=iscontinue();
                    if(r==0) break;
                    system("clear");
                }
                close(fd);
                printf("輸入完畢!\n");    
            }
            3.文件描述符號與重定向
                 1.判定文件描述符號與終端的邦定關系
                 int isatty(int fd)
                 返回非0:fd輸出終端
                    0:fd輸出被重定向
                 2.防止重定向
                   /dev/tty

            #include <stdio.h>
            #include <unistd.h>
            #include <fcntl.h>
            #include <stdlib.h>
            #include <string.h>

            int main()
            {
                int fd;
                printf("Hello\n");
                write(1,"World\n",6);
                fd=open("/dev/tty",O_WRONLY);
                if(isatty(1))
                {
                    write(1,"notredir\n",9);
                }
                else
                {
                    write(1,"redir\n",6);
                }
                write(fd,"Killer\n",7);
            }

            總結:
              1.make的多目標依賴規則以及偽目標
              2.文件的創建與打開(了解設置位的作用)
              3.文件的讀寫(字符串/基本類型/結構體)
              4.了解描述符號與重定向

            作業:
              1.完成上課的練習.
              2.寫一個程序使用結構體讀取1種的數據,
                 并全部打印數據,
                 并打印平均成績
              3.寫一個程序:
                查詢1種的數據.比如:輸入姓名,查詢成績
              4.寫一個程序,錄入保存如下數據:
                書名  出版社  價格  存儲量  作者  
              5.寫一個程序負責文件拷貝
                main 存在的文件  新的文件名
                要求:
                  文件存在就拷貝,不存在提示錯誤.

             

            精品无码人妻久久久久久| 波多野结衣AV无码久久一区| 久久丫忘忧草产品| 91性高湖久久久久| 香港aa三级久久三级| 99国产欧美精品久久久蜜芽| 久久久亚洲欧洲日产国码二区| 久久亚洲国产精品成人AV秋霞| 久久天天婷婷五月俺也去| 国产欧美久久久精品影院| 久久久久久综合网天天| 国内高清久久久久久| 亚洲va久久久噜噜噜久久狠狠| 模特私拍国产精品久久| 国产亚洲美女精品久久久2020| 精品国产青草久久久久福利| 亚洲精品国产字幕久久不卡| 少妇久久久久久被弄高潮| 久久精品国产亚洲AV电影| 久久久久久久尹人综合网亚洲| 精品久久人人做人人爽综合| 欧美午夜A∨大片久久 | 久久久久久精品久久久久| 久久久久se色偷偷亚洲精品av | 久久成人18免费网站| 久久精品成人一区二区三区| 亚洲欧洲久久久精品| 久久久精品人妻一区二区三区四| 国产亚洲欧美精品久久久| 久久91精品国产91久久麻豆| 久久国产福利免费| 无码人妻精品一区二区三区久久久 | 久久天天躁狠狠躁夜夜不卡| 久久这里都是精品| 韩国无遮挡三级久久| 久久亚洲国产成人精品无码区| 亚洲国产精品无码久久| 久久久久综合国产欧美一区二区| 久久久久亚洲精品无码蜜桃 | 久久久久国产精品麻豆AR影院| 亚洲人成网站999久久久综合|