UNIX編程基礎上

来源:http://www.cnblogs.com/smartxuchao/archive/2017/03/31/6649981.html
-Advertisement-
Play Games

時光飛逝,轉眼已經畢業快2年了,覺得自己學的東西多卻不精。對此深深的思考一下,覺得有必要連載unix環境編程文章,以此激勵自己學習。在此立貼為證,2天一篇博客從零開始闡述unix的環境編程。 參考書籍UNIX環境高級編程第三版 ...


時光飛逝,轉眼已經畢業快2年了,覺得自己學的東西多卻不精。對此深深的思考一下,覺得有必要連載unix環境編程文章,以此激勵自己學習。在此立貼為證,2天一篇博客從零開始闡述unix的環境編程。

參考書籍UNIX環境高級編程第三版

下一篇UNIX編程基礎下:http://www.cnblogs.com/smartxuchao/p/6658060.html

如上圖1.1描述的是一個UNIX的體繫結構。對於一個Linux的新手上圖描述就是幾個關鍵字。但對於一個Linux的高手來說,這個圖描述了太多的信息量了。

內核:從嚴格的意義上來說,可將操作系統理解成一個軟體,他控制電腦的硬體資源提供給應用程式運行的環境。其實Linux就是一個內核,它是GNU操作系統的內核。當然我們熟悉的MAC OSX也是GNU操作系統的內核。

系統調用:系統調用是內核對外提供服務一個介面,好比你要操作鍵盤。肯定有人會說這個知道我們可以通過API函數來操作鍵盤,你說的沒錯。但是要記住API函數也就是庫函數是建立在系統調用之上的。內核提供的系統調用數目非常有限,到2.6.23版本的內核也不過才達到僅僅325個,但是API函數有那麼多。

庫函數:就是一個滿足POSIX標準的函數集合

Shell:一類的特殊的軟體,它是命令解釋器。類比window下cmd,它也是通過系統調用方式與內核交互。我們可以通過strace 命令查看 shell命令的實現過程。如strace echo。

 

總結:系統調用是訪問內核的唯一手段,在驅動開發時候會更加深刻的理解系統調用。

登錄UNIX

我們登錄unix系統的時候,系統做了什麼呢?原來在我們輸入用戶名和密碼的時候,系統會在/etc/passwd查找匹配的用戶名和密碼

 

如上圖依次是用戶名:密碼(系統已將口令加密到另一個文件):數字用戶ID:數字組用戶ID:註釋碼:起始目錄:shell程式

總共有6個:號組成的7個欄位。哈哈現在明白你的登錄過程了吧,知道為什麼你的起始目錄在/root下了吧;

 

要註意的地方shell版本很多,要註意觀看自己的系統是什麼shell

目前比較流行的shell

1./bin/bash

2.  /bin/sh

3.  /bin/ksh

4.  /bin/csh

5.  /bin/tcsh

6.  /bin/dash

我們可以通過如下命令來觀看我們正在運行的shell的版本

 

文件和目錄

  1. Unix系統都是從根目錄/擴展下來的
  2. 我們創建新目錄的時候都出創建2個文件名分別是.和..。.是指向當前目錄,..指向上級目錄
  3. 文件命名的時候不要出現/和空字元。斜杠是用來分割路徑名中各個文件的,空格符則是終止一個路徑名

 

下麵我們用C來實現 shell中 ls命令

#include <unistd.h>
#include <dirent.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
int main(int argc,char *argv[])
{
    DIR *dp;//目錄的描述符
    struct dirent *dirp;//目錄內容的結構體
    if(argc != 2)
    {
        printf("please input --help");
        return -1;
    }
    if(strcmp(argv[1],"--help") == 0)
    {
        puts("-a, --all不隱藏任何以. 開始的項目\n \
              -A, --almost-all        列出除. 及.. 以外的任何項目\n\
              --author            與-l 同時使用時列出每個文件的作者\n\
              -b, --escape            以八進位溢出序列表示不可列印的字元\n");
        return 0;
    }
    if((dp = opendir(argv[1])) == NULL)
        perror("can not open %s",argv[1]);/判斷標準錯誤的類型
    while((dirp = readdir(dp)) != NULL )
        printf("%s\n",dirp->d_name);
   // printf("Hello world!\n");
    return 0;
}

我想根據運行結果很容易看出來我們的程式。

 

輸入和輸出

1、  文件描述符:通常是一個非負的整數,內核用以表示一個特定的進程正在訪問的文件。當內核打開一個現有的文件或創建一個新的文件時返回的一個描述符。在讀寫的時候可以使用這個描述符

2、  每當運行一個新的程式,所有shell都會為其打開3個描述符,即標準的輸入、標準的輸出、標準的錯誤。預設3個描述符都是指向終端的。好比我們運行任意一個c程式,如果出錯誤,你會在哪兒看到錯誤提示,對的我們都會在終端看到。同理標準的輸入和輸出都是在終端。

說的這肯定有疑問這終端可以修改麽當然可以的如下

使用標準的ls

可以看得出結果輸出在終端上

如何修改成 ls >2.txt,好吧終端上什麼也沒列印。結果輸出到了2.txt中了,cat 2.txt(打開2.txt文件)果然發現了ls命令的結果

程式和進程

1、程式是一個存儲在磁碟的目錄中的一個可執行文件。內核使用exec函數(7個exec中一個),將程式讀到記憶體並執行

2、程式執行的實例就是進程,每個進程都有一個id叫做pid

3、線程:一個進程通常只有一個任務線程在處理,如果對於一個多個問題的事情,可以使用多個線程去處理,事情將變得異常輕鬆。一個進程的線程共用同一地址空間,文件描述符,棧等。當然如何區分不同的線程,對,使用線程ID,線程ID只在進程中起作用。

下麵是應用程式如何使用exec函數來吊起其他的程式的執行,加深對內核運行程式的理解

#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <string.h>
int main()
{
    char buf[10];
    int i;
    pid_t pid;
    int status;
    printf("cmd:");
    memset(buf,'\0',10);

    while(gets(buf))
    {
        

        if((pid = fork()) < 0){
            perror("fork creat error\n");
        }else if(pid == 0){
            if(execlp(buf,buf,(char *)0 ) < 0)//運行一個指定的程式
               perror("execlp error\n");
               exit(127);
        }

         if((pid = waitpid(pid,&status,0)) < 0)
            perror("wait pid error\n");

        printf("cmd:");

    }

    return 0;
}

本文章為unix環境編程的基礎上,涉及到很多知識點都是很簡單的描述下,比如線程和進程都會在後期的文章細細的說到。下一遍博客問unix環境編程基礎下,繼續在巨集觀上描述unix系統。結合unix環境編程上下再展開將會涵蓋unix大多數內容。2017/3/31

下一篇UNIX編程基礎下:http://www.cnblogs.com/smartxuchao/p/6658060.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 利用鍵盤模擬進程的三種操作狀態,並且使用C++中的list模板模擬記憶體的分配和回收。 能夠模擬進程的創建與撤銷過程 l可對進程的狀態進行全面的控制 按先進先出方式管理就緒和阻塞隊列,能夠按隊列形式輸出進程狀 用PCB代表進程,用全局變數表示進程的個數。 1 #include <iostream> 2 ...
  • putty查詢log文當里的"test"關鍵字 /home/iotserver/WebServer3_log# grep "test" log.log.bak2ls -H 查詢所有文件ls -L 查詢所有目錄cd .. 返回上一級cd h 進入h目錄 Linux VPS 和 Windows VPS ... ...
  • 1、打開Virtualbox軟體,啟動ubuntu虛擬機。 Ctrl + Alt + T 打開終端輸入一下命令: sudo apt-get update 然後安裝ssh 輸入:sudo apt-get install ssh 最後關閉虛擬機 2、更改虛擬機網路連接方式 這個是關鍵點:網卡設置成橋接模 ...
  • 由於redhat 的更新包只對註冊的用戶生效,所以需要自己手動更改成CentOS 的更新包, CentOS幾乎和redhat是一樣的,所以無需擔心軟體包是否可安裝,下麵是安裝步驟。 ...
  • 題目非常簡單,rand是偽隨機的,沒有種子。所以直接自己看下rand的第一個是啥然後和deadbeaf異或一下就行了。 ...
  • 最近在做freeradius的高可用配置,使用lvs的vip做輪詢: freeradius的配置見前面的文章; 下麵是lvs的keepalived的配置: global_defs { router_id LVS_DEVEL_TEST } vrrp_sync_group LVS_RA { group ...
  • 1、安裝 npm install pm2 -gd 2、啟動 pm2 start ./bin/www 3、pm2 save 4、pm2 startup 5、pm2 save 註:上面幾個步驟有幾個坑: 1、從第二步開始,要進入root許可權操作。不同用戶下的pm2 list 是不同的; 2、還是第二步, ...
  • 作為一隻linux菜的不能更菜的鳥,在linux前臺運行了一個服務後,我必須退出後才能執行其他命令,可是我的服務需要一直運行,於是我同事就給我在該命令後加了">/dev/null 2>&1"據說是這條命令就可以轉向後臺了,我在網上搜索了一下總體意思就是“用來避免shell命令或者程式等運行中有內容輸 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...