1. 程式人生 > >Linux程序入門學習(四)-程序啟動退出

Linux程序入門學習(四)-程序啟動退出

1. 程序的退出

exit 函式用於程序退出
標頭檔案:#include <stdlib.h>
函式原型:void exit(int status);
引數:int status:退出狀態值(可以任意寫,值規定0 以上的正整數)
返回值:無

_exit 函式用於程序退出
標頭檔案:#include <unistd.h>
函式原型:void _exit(int status);

說明:
1. 如果程序正常退出,則status 一般為0;
2. 如果程序異常退出,則status 一般為非0;
3. 標準C庫已經定義兩個巨集提供使用EXIT_SUCCESS 和 EXIT_FAILURE,正常退出exit(EXIT_SUCCESS ),以及異常退出exit(EXIT_FAILURE)。

exit 與_exit 區別
兩者的區別主要是體現在處理過程中,如下圖所示:
exit,_exit
_exit()函式會直接呼叫exit 系統呼叫退出,其間只是清除其使用的記憶體空間,並銷燬其在核心中的各種資料結構。
exit()函式退出時會先自重新整理標準IO 總線上殘留資料到核心,如果程序註冊了“退出處理函”還自動執行這些函式,最後才呼叫exit 系統呼叫。
下面用個例項來說明:
程式碼一:

     1  /*****************************************************************************
     2  * File Name: exit.c
     3  * Author: 謝保成
     4  * E-mail: 
[email protected]
5 * Create Time: Fri 18 Aug 2017 07:37:27 PM PDT 6 ******************************************************************************/
7 8 #include <stdlib.h> 9 #include <stdio.h> 10 #include <unistd.h> 11 12 int main() 13
{ 14 printf("Using exit..\n"); 15 printf("This is the end."); 16 exit(0); 17 } 18

執行結果:
exit
程式碼二:

     1  /*****************************************************************************
     2  * File Name: exit.c
     3  * Author: 謝保成
     4  * E-mail: [email protected]
     5  * Create Time: Fri 18 Aug 2017 07:37:27 PM PDT
     6  ******************************************************************************/
     7  
     8  #include <stdlib.h>
     9  #include <stdio.h>
    10  #include <unistd.h>
    11  
    12  int main()
    13  {
    14      printf("Using exit..\n");
    15      printf("This is the end.");
    16      _exit(0);
    17  }
    18

執行結果:
_exit

說明:換行符’\n’又重新整理緩衝區的作用,所以在第二段程式碼中,printf(“This is the end.”);沒使用’\n’,而且呼叫_exit結束程序,所以沒有列印第二句話。

2. 程序的啟動

system 函式用於啟動並執行shell 命令
標頭檔案:#include <stdlib.h>
函式原型:int system(const char *command);
返回值:

成功:非0
失敗:0

引數列表: const char *command:執行的命令

示例:
     1  /*******************************************************************************
     2  * File Name: system.c
     3  * Author: 謝保成
     4  * E-mail: [email protected]
     5  * Create Time: Fri 18 Aug 2017 07:59:07 PM PDT
     6  ********************************************************************************/
     7  
     8  #include <stdio.h>
     9  #include <stdlib.h>
    10  #include <unistd.h>
    11  
    12  int main()
    13  {
    14      system("ls -l");
    15      exit(0);
    16  }

執行結果:
system

Exec 函式族
exec 函式族提供了一種在程序中啟動另一個程式執行的方法。它可以根據指定的檔名或目錄名找到可執行檔案,並用它來取代原呼叫程序的資料段、程式碼段和堆疊段。在執行完之後,原呼叫程序的內容除了程序號外,其他全部都被替換了。

以下是exec函式族的標準介面
exec
示例1:execl
下面展示子程序被創建出來之後執行的程式碼,以及如何載入這個指定程式。被子程序載入的示例程式碼:

     1  /*******************************************************************************
     2  * File Name: child_elf.c
     3  * Author: 謝保成
     4  * E-mail: [email protected]
     5  * Create Time: Fri 18 Aug 2017 10:18:22 PM PDT
     6  ********************************************************************************/
     7  
     8  #include <stdio.h>
     9  #include <stdlib.h>
    10  #include <unistd.h>
    11  
    12  int main(int argc, char **argv)
    13  {
    14      printf("[pid:%d]:child_elf\n", (int)getpid());
    15      exit(EXIT_SUCCESS);
    16  }
    17  

下面是使用exec 函式簇中的execl 來讓子程序載入上述程式碼的示例:

     1  /*****************************************************************************
     2  * File Name: exec.c
     3  * Author: 謝保成
     4  * E-mail: [email protected]
     5  * Create Time: Fri 18 Aug 2017 10:22:45 PM PDT
     6  ******************************************************************************/
     7  
     8  #include <stdio.h>
     9  #include <stdlib.h>
    10  #include <unistd.h>
    11  
    12  int main(int argc, char **argv)
    13  {
    14      pid_t pid;
    15      pid = fork();
    16  
    17      /*父程序*/
    18      if(pid > 0)
    19      {
    20          printf("[pid :%d] parent.\n", (int)getpid());
    21          exit(EXIT_SUCCESS);
    22      }
    23      /*子程序*/
    24      if(pid == 0)
    25      {
    26          printf("[pid:%d]child.\n", (int)getpid());
    27          execl("./child_elf", "./child_elf", NULL);
    28  
    29          /*因為執行execl後,.text程式碼段中的程式程式碼已被child_elf替代*/
    30          printf("NEVER be printed\n");/*不執行*/
    31          exit(EXIT_SUCCESS);
    32      }
    33  
    34      return 0;
    35  }
    36  

執行結果:
execl
示例2:execv
用一下兩行程式碼代替execl(“./child_elf”, “./child_elf”, NULL);

char *argv[] = {"./child_elf",NULL);
execv("./child_elf",argv);

示例3:execlp
執行linux 命令ls -l

execlp("ls", "ls", "-l", NULL);

示例4:execve

     1  /*******************************************************************************
     2  * File Name: execlp.c
     3  * Author: 謝保成
     4  * E-mail: [email protected]
     5  * Create Time: Fri 18 Aug 2017 10:59:34 PM PDT
     6  ********************************************************************************/
     7  
     8  #include <stdio.h>
     9  #include <stdlib.h>
    10  #include <unistd.h>
    11  
    12  int main()
    13  {
    14      char *argv[] = {"ls", "-l", NULL};
    15      char *envp[] = {"PATH=/bin", 0};
    16      execve("/bin/ls", argv, envp);
    17  
    18      return 0;
    19  }
    20  

執行結果:
execve
示例5:execvp

char * argv[] ={ "ls", "-al", 0};
execvp("ls", argv);

注意:
在使用exec 函式族時,一定要加上錯誤判斷語句常見的錯誤原因有:
1)找不到檔案或路徑,此時errno 被設定為ENOEN
2)陣列argv 和envp 忘記用NULL 結束,此時errno 被設定為EFAULT
3)沒有對應可執行檔案的執行許可權,此時errno 被設定為EACCESS

相關推薦

Linux程序入門學習-程序啟動退出

1. 程序的退出 exit 函式用於程序退出 標頭檔案:#include <stdlib.h> 函式原型:void exit(int status); 引數:int status:退出狀態值(可以任意寫,值規定0 以上的正整數) 返回值:無

Linux程序入門學習-認識程序

1.程序的概念 一個可執行的程式檔案(ELF格式)被載入到記憶體當中,然後讓CPU逐條執行其程式碼,根據程式碼作出相應的動作,這樣一個動態程序就產生了。因此,程序是一個動態變化的過程。 下面用一張圖來表示一個程式從編寫到最終執行的過程: 一段固化在磁碟

Linux程序入門學習-訊號通訊

訊號通訊 什麼是訊號? 在作業系統中,當我們無正常結束一程式時,可以用工作管理員強行結束這個程序。在unix/linux 中,具體的實現過程是通過程序A 生成一個訊號併發射出去,執行中的程序B捕獲到這個訊號然後根據這個訊號的特定意義做出相應的操作。 訊

Ubuntu Linux 菜鳥正在入門學習——檔案系統的概念

1.什麼是檔案系統      檔案系統是對一個儲存裝置上的資料和元資料進行組織的機制,其目的是易於實現資料的查詢和存取。Linux檔案系統介面實現為分層的體系結構,從而將使用者介面層 檔案系統實現和操作儲存裝置的驅動程式分開。 1)儲存介質 用以儲存資料的物理裝置,如軟盤

NS2入門學習之Otcl知識點

面向物件的Tcl語言,物件和類的概念同C++類似。 1.類和物件的定義 % Class  Animal #定義類名 % Animal animal_1#產生類的物件 animal info class =>Animal

Linux基本命令學習——查詢,搜尋

20.man 命令  用於檢視內部命令 21.命令 --help  用於檢視外部命令 22.grep [-option] 檔名     -n 顯示匹配行及行號     -c 只顯示匹配行的計數   普通查詢:grep -n 'aq' 123   使用*:grep -n 'aq' 1*   使用\

Linux基本命令學習——查找,搜索

數據 普通 命令 手動更新 基本命令 表達 --help help grep 20.man 命令  用於查看內部命令 21.命令 --help  用於查看外部命令 22.grep [-option] 文件名     -n 顯示匹配行及行號     -c 只顯示匹配行的計數

python資料分析pandas包入門學習處理缺失資料

本文參考《利用Python進行資料分析》的第五章 pandas入門 4 處理缺失資料 缺失資料(missing data)在大部分資料分析應用中都很常見。Pandas的設計目標之一就是讓缺失資料的處理任務儘量輕鬆。例如,pandas物件上的所有描述統計都排除了缺失資料

JAVA入門學習

4.java原始檔與類 5.編碼規範   5.1.儲存規範        1)java原始檔的路徑中儘量不要含有空格與中文        2)java原始檔名不能有空格   5.2.命名規範        程式設計師在開發程式時,會給類,變數,方法,常量起一些名字,在起名

Pytorch入門學習---- 多GPU的使用

DataParrallel import torch.nn as nn class DataParallelModel(nn.Module): def __init__(self):

Linux核心驅動學習----記憶體管理子系統

kmalloc()和vmalloc()介紹 kmalloc() 用於申請較小的、連續的實體記憶體 1. 以位元組為單位進行分配,在<linux/slab.h>中 2. void *kmalloc(size_t size, int flags) 分配的記憶體實體地址上連續,虛擬地址上自然

Linux檔案系統學習之read open系統呼叫

open的執行過程:v2.6.30  Open Sys_open |do_sys_open() |get_unused_fd_flags ()//得到一個可用的檔案描述符;通過該函式,可知檔案描述符                                      

Linux學習服務與程序

一、Linux 系統啟動與快捷鍵設定 1.Linux 系統啟動過程 系統的 引導 和 初始化 是作業系統實現控制的第一步。 Linux系統的初始化主要包括 核心 和 init程式 兩部分: 核心主要完成對系統硬體的檢測和初始化工作。 init程式主要完成對系統的

Linux常用命令程序的安裝與管理

rpm 編譯安裝 侯良金 linux 安裝軟件 Linux常用命令(四)程序的安裝與管理一、Linux應用程序基礎1、Linux應用程序的組成■普通的可執行程序文件。一般保存在“/usr/bin”目錄中,普通用戶即可執行。■服務器程序、管理程序文件。一般保存在“/usr/sbin”

程序學習程序邏輯層之註冊頁面

其他 nor stop 默認 pat 標題 pre 開啟 開始 小程序學習(四)小程序邏輯層之註冊頁面 註冊頁面(Page) 小程序頁面的註冊,是通過 Page() 函數來完成的。接受一個 object 參數,指定頁面的初始數據,生命周期、事件處理函數等。 object

鳥哥的linux私房菜學習-vim程序編輯器

常常 分享 最後一行 編碼 取代 行為 edi 檔案 img 1.vi和vim 在 Linux 的世界中,絕大部分的配置文件都是以 ASCII 的純文本形態存在,因此利用簡單的文字編輯軟件就能夠修改設定了! 常常聽到的就有: emacs, pico, nano, joe

Linux 程序間通訊訊號量

1 訊號量概述 訊號量和其他IPC不同,並沒有在程序之間傳送資料,訊號量用於多程序在存取共享資源時的同步控制就像交通路口的紅路燈一樣,當訊號量大於0,表示綠燈允許通過,當訊號量等於0,表示紅燈,必須停下來等待綠燈才能通過。 程序間的互斥關係與同步關係存在的根源在於臨界資

Linux程序間通訊訊號量

雖然本文是記錄使用訊號量保證程序的同步與互斥的,但是其實也可以看做是程序之間的通訊問題,為了與前面的保持一致,所以還是叫做 Linux程序間通訊了 (強迫症...) 訊號量 基本概念 程序間通訊的方式有管道、訊息佇列、共享記憶體這些都是程序間的資訊通訊,而訊號量可以理解為程序使用的臨界資源的狀態說明,訊

Linux環境程序間通訊 訊號燈(轉)

轉自http://www.ibm.com/developerworks/cn/linux/l-ipc/part4/, 作者:鄭彥興訊號燈與其他程序間通訊方式不大相同,它主要提供對程序間共享資源訪問控制機制。相當於記憶體中的標誌,程序可以根據它判定是否能夠訪問某些共享資源,同時,程序也可以修改該標誌。除了用於訪

Linux 網路協議棧之核心鎖—— 程序上下文與中斷上下文的理解

一.什麼是核心態和使用者態 核心態:在核心空間執行,通常是驅動程式,中斷相關程式,核心排程程式,記憶體管理及其操作程式。 使用者態:使用者程式執行空間。 二.什麼是程序上下文與中斷上下文 1.程序上下文: (1)程序上文:其是指程序由使用者態切換到核心態是需