1. 程式人生 > >Linux程序相關(二)

Linux程序相關(二)

一、模擬實現殭屍程序, 孤兒程序

  1.殭屍程序:殭屍程序是一個比較特殊的狀態,當程序退出並且父程序沒有讀取到子程序退出的返回程式碼時就會產生殭屍程序,而且殭屍程序會以終止狀態保持在程序表中,並且會一直等待父程序讀取退出戶狀態程式碼,那麼當子程序退出,父程序在執行,但父程序沒有讀取到子程序狀態,那麼子程序就進入到殭屍狀態。
   1.1、實現一個殭屍程序

    1 #include <stdio.h>                                                                   
    2 #include <stdlib.
h> 3 4 int main() 5 { 6
pid_t id = fork(); 7 if(id < 0) 8 { 9 perror("fork"); 10
return 1; 11 } 12 else if(id > 0){ 13 printf("parent [%d] is sleeping...\n", getpid()); 14 sleep(30); 15 } 16 else{ 17 printf("child [%d] is begin...\n", getpid()); 18 sleep(5); 19 exit(EXIT_SUCCESS); 20 } 21 return 0; 22 } ~

首先在另一個終端下執行while :; do ps aux | grep static | grep -v grep; sleep 1; echo "#############"; done啟動監控
在這裡插入圖片描述

然後執行./static
在這裡插入圖片描述

之後就可以看到子程序變成了殭屍程序
在這裡插入圖片描述

  2.孤兒程序:相比於殭屍程序,如果父程序提前退出,那麼子程序後退出, 這時子程序就稱為“孤兒程序”,當然了OS不可能放任孤兒程序不管,孤兒程序被1號init程序領養,也由init程序回收。
   2.1、實現孤兒程序

 1 #include <stdio.h>                                                                     
  2 #include <unistd.h>                                                                    
  3 #include <stdlib.h>                                                                    
  4                                                                                        
  5 int main()                                                                             
  6 {                                                                                      
  7   pid_t id = fork();                                                                   
  8   if(id < 0)                                                                           
  9   {                                                                                    
 10     perror("fork");                                                                    
 11     return 1;                                                                          
 12   }                                                                                    
 13   else if(id == 0){//child                                                             
 14     printf("I am child, pid is [%d]\n", getpid());                                     
 15     sleep(10);                                                                         
 16   }else{                                                                               
 17     printf("I am parent, pid is [%d]\n", getpid());                                    
 18     sleep(3);                                                                          
 19     exit(0);                                                                           
 20   }                                                                                    
 21   return 0;                                                                            
 22 }                                                                                      
  1 orphan_process:Orphan_process.c                                                                                                                                                            
  2   gcc -o [email protected] $^                                                                                                                                                                             
  3                                                                                                                                                                                            
  4 .PHONY:clean                                                                                                                                                                               
  5 clean:                                                                                                                                                                                     
  6   rm -rf orphan_process                                                        

首先在另一個終端下執行while :; do ps aux | grep orphan_process | grep -v grep; sleep 1; echo "#############"; done啟動監控
在這裡插入圖片描述

執行./orphan_process
在這裡插入圖片描述

之後就可以看到子程序被回收
在這裡插入圖片描述

二、setenv, export等環境變數相關的函式和命令

環境變數裡包含了程式執行時的完整路徑,以便於我們在其他地方執行某個程式時,OS會在環境變數裡搜尋該程式的路徑,然後執行。

  • Linux中的環境變數
PATH //這個變數包含了一系列由冒號分隔開的目錄,系統就從這些目錄裡尋找可執行檔案。如果你輸入的可執行檔案(例如ls、rc-update或者emerge) 不在這些目錄中,系統就無法執行它(除非你輸入這個命令的完整路徑,如/bin/ls)。   
ROOTPATH //這個變數的功能和PATH相同,但它只羅列出超級使用者(root)鍵入命令時所需檢查的目錄。   
LDPATH //這個變數包含了一系列用冒號隔開的目錄,動態連結器將在這些目錄裡查詢庫檔案。  
MANPATH //這個變數包含了一系列用冒號隔開的目錄,命令man會在這些目錄裡搜尋man頁面。   
INFODIR //這個變數包含了一系列用冒號隔開的目錄,命令info將在這些目錄裡搜尋info頁面。   
PAGER //這個變數包含了瀏覽檔案內容的程式的路徑(例如less或者more)。   
EDITOR //這個變數包含了修改檔案內容的程式(檔案編輯器)的路徑(比如nano或者vi)。   
KDEDIRS //這個變數包含了一系列用冒號隔開的目錄,裡面放的是KDE相關的資料。  
CONFIG_PROTECT //這個變數包含了一系列用空格隔開的目錄,它們在更新的時候會被Portage保護起來。  
CONFIG_PROTECT_MASK //這個變數包含了一系列用空格隔開的目錄,它們在更新的時候不會被Portage保護起來。  
  • 環境變數命令
1.echo //顯示某個環境變數值 echo $PATH  
2.export //設定一個新的環境變數 export HELLO="hello" (可以無引號)  
3.env //顯示所有環境變數  
4.set //顯示本地定義的shell變數  
5.unset //清除環境變數 unset HELLO  
6.readonly //設定只讀環境變數 readonly HELLO  
  • C語言中的getenv(); setenv(); unsetenv();函式可以設定或訪問某一個環境變數。
    • getenv()函式
    SYNOPSIS
       #include <stdlib.h>
        char *getenv(const char *name);
        char *secure_getenv(const char *name);
    Feature Test Macro Requirements for glibc (see feature_test_macros(7)):
       secure_getenv(): _GNU_SOURCE
    

    根據getenv()函式的定義可以看出,一共有兩個getenv()函式,其中char *getenv(const char *name);是如果所查詢的環境變數不存在就返回一個NULL指標,存在就返回其地址,由於其返回值存放在一個數組裡,所以不用擔心再次查詢會覆蓋之前的值,而char *secure_getenv(const char *name);也是同樣的返回值,但其應用於執行緒安全。

    • setenv()函式
    SYNOPSIS
       #include <stdlib.h>
       int setenv(const char *name, const char *value, int overwrite);
    Feature Test Macro Requirements for glibc (see feature_test_macros(7)):
       setenv(), unsetenv():
           _BSD_SOURCE || _POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600
    DESCRIPTION
       The  setenv()  function  adds the variable name to the environment with
       the value value, if name does not already exist.  If name does exist in
       the  environment,  then  its  value is changed to value if overwrite is
       nonzero; if overwrite is zero, then the value of name is  not  changed.
       This  function makes copies of the strings pointed to by name and value
       (by contrast with putenv(3)).
    
    

    setenv()函式,顧名思義可以設定環境變數,當環境變數中沒有要新增的name時就新增該變數名,若存在就看overwrite是否非零,若為零就不覆蓋,若非零就覆蓋。成功時返回0,錯誤時返回-1,並指出原因。

    • unsetenv()函式
    SYNOPSIS
       #include <stdlib.h>
       int unsetenv(const char *name);
    Feature Test Macro Requirements for glibc (see feature_test_macros(7)):
       setenv(), unsetenv():
           _BSD_SOURCE || _POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600
           
       The unsetenv() function deletes the variable name from the environment.
       If  name does not exist in the environment, then the function succeeds,
       and the environment is unchanged.
    

    unsetenv()函式就是刪除某個環境變數,若某個環境變數不存就返回成功,環境變數不作改變,返回值和setenv()函式一致。

    • 指標變數environ指向的是一個包含所有環境變數的列表.使用以下程式碼可以打印出所有環境變數
    1 #include <stdio.h>                                                        
    2 extern char**environ;                                                     
    3 int main ()                                                               
    4 {                                                                         
    5   char**path;                                                             
    6     for (path =environ;*path !=NULL;++path)                               
    7         printf ("%s \n ",*path);                                          
    8   return 0;                                                               
    9 }    
    
    可以看到以下結果
     SSH_AUTH_SOCK=/run/user/1000/keyring/ssh
     SESSION_MANAGER=local/unix:@/tmp/.ICE-unix/1837,unix/unix:/tmp/.ICE-unix/1837
     USERNAME=kui
     GNOME_SHELL_SESSION_MODE=classic
     PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/home/kui/.local/bin:/home/kui/bin
     MAIL=/var/spool/mail/kui
     DESKTOP_SESSION=gnome-classi
     QT_IM_MODULE=xim
     QT_QPA_PLATFORMTHEME=qgnomeplatform
     XDG_SESSION_TYPE=x11
     PWD=/home/kui
     XMODIFIERS=@im=ibus
     LANG=zh_CN.UTF-8
     GDM_LANG=zh_CN.UTF-8
     GDMSESSION=gnome-classic
     HISTCONTROL=ignoredups
     XDG_SEAT=seat0
     HOME=/home/kui
     SHLVL=2
     GNOME_DESKTOP_SESSION_ID=this-is-deprecated
     XDG_SESSION_DESKTOP=gnome-classic
     LOGNAME=kui
     XDG_DATA_DIRS=/home/kui/.local/share/flatpak/exports/share/:/var/lib/flatpak/exports/share/:/usr/local/share/:/usr/share/
     DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-8PBK3gNeEw,guid=e9d3af1ed81eabd51e3431735bef8722
     LESSOPEN=||/usr/bin/lesspipe.sh %s
     WINDOWPATH=1
     XDG_RUNTIME_DIR=/run/user/1000
     DISPLAY=:0
     XDG_CURRENT_DESKTOP=GNOME-Classic:GNOME
     COLORTERM=truecolor
     XAUTHORITY=/run/gdm/auth-for-kui-KUriSB/database_=./test
    

相關推薦

Linux程序相關

一、模擬實現殭屍程序, 孤兒程序   1.殭屍程序:殭屍程序是一個比較特殊的狀態,當程序退出並且父程序沒有讀取到子程序退出的返回程式碼時就會產生殭屍程序,而且殭屍程序會以終止狀態保持在程序表中,並且會一直等待父程序讀取退出戶狀態程式碼,那麼當子程序退出,父程序

Linux程序分析 父子程序程序

ps命令一般用來顯示終端資訊和程序資訊,執行命令ps -eo pid,comm,cmd可以輸出所有程序的資訊,e代表所有程序,後面三個引數是需要輸出的資訊。 第一列PID是一個整數,每一個程序都有一個唯一的PID來代表自己的身份,程序也可以根據PID來識別其他

Linux程序通訊IPC訊息佇列

訊息佇列提供了一種從一個程序向另一個程序傳送一個數據塊的方法。每個資料塊都被認為含有一個型別,接收程序可以獨立地接收含有不同型別的資料結構。我們可以通過傳送訊息來避免命名管道的同步和阻塞問題。但是訊息佇列與命名管道一樣,每個資料塊都有一個最大長度的限制。

linux系統程序安裝yum工具2-yum源管理

內容 centos 備份 hang clean 原生 yum 聯網 系統 繼續我們的yum工具應用之旅,yum工具之所以方便就是因為有方便的在線雲庫,實際工作中我們可能沒辦法鏈接互聯網,或者我們想安裝的程序原生源那麽我們能不能用其他方式應用方便的yum源呢? 一、使用光盤

Linux學習之程序通訊

言之者無罪,聞之者足以戒。 ——《詩序》 命令:kill -l   可以檢視核心可以傳送多少種訊號 命令:ps -axj 可以檢視程序的狀態 訊號: 訊號通訊,其實就是核心向用戶空間程序傳送訊號,只有核心才能發訊號,使用者空間程序不能傳送訊號 訊號通訊的框架: (

Linux系統管理網絡服務

網絡服務 linux redhat 紅帽 點擊下載:Linux系統管理(二)(網絡服務)本文出自 “飛奔的魚兒” 博客,請務必保留此出處http://feiyuer.blog.51cto.com/6967044/1931978Linux系統管理(二)(網絡服務)

排球計分程序重構

posit sco com total 自由人 team bsp score 位置 數據庫的設計 1.CompetitionScore表 用於記錄總比分 比如3:0 3:1這樣的大比分 字段: Id HomeTeamId——主隊Id GuestTeamId——客隊Id Ho

Linux初級命令對於linux的初級操作

linux入門必看Linux初級命令(二)對於linux的初級操作1.touch -修改文件的時間戳記.change file timestamps.、意外功能:可以創建未擁有的文件。 常用選項: -c,--no-create:不創建任何文

Linux網絡

tcp fsm nmtui 一、Linux網絡命令分類二、ifcfg家族三、iproute2家族四、nmtui家族五、TCP FSM一、Linux網絡命令分類分類:1.ifcfg家族://net-tools ifconfig:配置ip,netmask,gateway route:配置

Linux常用命令

swd name unalias /etc/ 忘記 man 所有 類型 超過 1,alias 別名 簡化復雜命令的輸入 alias myls=‘ls -lh‘ #定義別名 unalias m

Linux故障處理更改root密碼和修復文件系統

無法識別 丟失 ges 包括 故障處理 磁盤 free roo ext4 Linux故障處理(二)更改root密碼和修復文件系統一、遺忘root用戶的密碼大多數時候Linux主機中具有root權限的用戶只有一個,因此需要通過其他途徑來重設root賬號密碼。最簡單的途徑是在開

02-Linux基礎入門

... man sso term 創建文件系統 www. lease linux系統 結果 一、命令必須掌握的命令:man,touch,ls,mkdir,cp,rm,mv,echo,pwd,cat,alias,unalias,head,tail,tree,rmdir想拿到高

Linux學習總結 網絡配置-NAT方式靜態IP配置篇

開機啟動 log scrip 分享 如何快速 報錯 網絡服務 重新 查找 一:DHCP 服務驗證 1: 之前我們在裏面已經裝好了centos,當時我們選擇的組網方式為NAT方式,那麽我們怎麽樣如何快速實現虛擬機系統訪問外網呢?能不能直接上網呢,來我們試一下ping baid

linux基礎命令

命令1)grep 文本過濾語法:grep [選項] 模式或關鍵字 文件列表--clolor 帶顏色顯示匹配到的關鍵字-i 忽略大小寫-v 取反^ 以關鍵字開頭$ 以某個關鍵字結尾^$ 空行-c 統計匹配到的行數-l 與-r聯用,只顯示包含關鍵字的文件的名字-r 遞歸顯示-q 靜默輸出 (寫腳本時使用)-n 顯

linux 基礎命令

linux 命令 今天繼續和大家分享(承接上一章) (40)vim +文件名(編輯文件,如果文件不存在也是可以編輯的,但是必須保存,單獨使用vim是打開vim的使用手冊,裏面一樣可以編輯 文字,但是保存退出前要這麽寫shift+:w(空格)/路徑/文件名) [root@localhost boke]#

linux 基礎服務

linux windows 基礎服務 登陸xshell的時候碰到個問題,突然不能登陸了如下圖:1.檢查虛擬機的虛擬網絡編輯器,改成如下配置,這裏的名字是你的網絡連接相同的,找一個能上網的連接,不要使用自動。 httpd基於端口的創建 [root@localhost conf.d]# rpm -ql

Linux入侵分析分析SSH登錄日誌

入侵分析 雲安全 SSH日誌 SSH登錄情況分析 1.wtmp日誌 last last -x -F 2.查看在線用戶情況 (1)w 命令用於顯示已經登陸系統的用戶列表,並顯示用戶正在執行的指令。單獨執行w命令會顯示所有的用戶,您也可指定用戶名稱,僅顯示某位用戶的相關信息。 (2)who am i

61.mysql主從相關

mysql主從相關(二)一、mysql主主 兩臺mysql都可讀寫,互為主備,默認只使用一臺(masterA)負責數據的寫入,另一臺(masterB)備用; 二、mysql讀寫分離 首先設置主從,讀的操作會在從上執行,寫的操作在主上執行 mysql-proxy mysql官方產品。 mycat 開源的分布式

Linux學習筆記:實戰-根據微服務端口號關閉進程

java 地方 img linux學習 區分 殺死進程 項目組 cannot home 前言 現在項目組基本都用Springboot,每個服務占用一個端口號,有時需要選擇性的關閉,但在任務管理器上他們的名稱都是java.exe,無法區分,這才學以致用。 killPort.s