1. 程式人生 > >Linux環境程式設計--waitpid與fork與execlp

Linux環境程式設計--waitpid與fork與execlp

  waitpid(等待子程序中斷或結束)
  表頭檔案
  #include<sys/types.h>
  #include<sys/wait.h>
  定義函式 pid_t waitpid(pid_t pid,int * status,int options);
  函式說明
  waitpid()會暫時停止目前程序的執行,直到有訊號來到或子程序
  結束。如果在呼叫 wait()時子程序已經結束,則 wait()會立即
  返回子程序結束狀態值。 子程序的結束狀態值會由引數 status 返回,
  而子程序的程序識別碼也會一起返回。如果不在意結束狀態值,則
  引數 status 可以設成 NULL。引數 pid 為欲等待的子程序識別碼,
  其他數值意義如下:
  pid<-1 等待程序組識別碼為 pid 絕對值的任何子程序。
  pid=-1 等待任何子程序,相當於 wait()。
  pid=0 等待程序組識別碼與目前程序相同的任何子程序。
  pid>0 等待任何子程序識別碼為 pid 的子程序。
  引數 option 可以為 0 或下面的 OR 組合:
  WNOHANG 如果沒有任何已經結束的子程序則馬上返回, 不予以等待。
  WUNTRACED 如果子程序進入暫停執行情況則馬上返回,但結束狀態不予以理會。
  子程序的結束狀態返回後存於 status,底下有幾個巨集可判別結束情況:
  WIFEXITED(status)如果子程序正常結束則為非 0 值。
  WEXITSTATUS(status)取得子程序 exit()返回的結束程式碼,一般會先用 WIFEXITED 來判斷是否正常結束才能使用此巨集。
  WIFSIGNALED(status)如果子程序是因為訊號而結束則此巨集值為真
  WTERMSIG(status) 取得子程序因訊號而中止的訊號程式碼,一般會先用 WIFSIGNALED 來判斷後才使用此巨集。
  WIFSTOPPED(status) 如果子程序處於暫停執行情況則此巨集值為真。一般只有使用 WUNTRACED 時才會有此情況。
  WSTOPSIG(status) 取得引發子程序暫停的訊號程式碼,一般會先用 WIFSTOPPED 來判斷後才使用此巨集。
  如果執行成功則返回子程序識別碼(PID) ,如果有錯誤發生則返回
  返回值-1。失敗原因存於 errno 中。
  /******
  * waitpid.c - Simple wait usage
  *********/
  #include <unistd.h>
  #include <sys/types.h>
  #include <sys/wait.h>
  #include <stdio.h>
  #include <stdlib.h>
  int main( void )
  {
  pid_t childpid;
  int status;
  childpid = fork();
  if ( -1 == childpid )
  {
  perror( "fork()" );
  exit( EXIT_FAILURE );
  }
  else if ( 0 == childpid )
  {
  puts( "In child process" );
  sleep( 3 );//讓子程序睡眠3秒,看看父程序的行為
  printf("\tchild pid = %d\n", getpid());
  printf("\tchild ppid = %d\n", getppid());
  exit(EXIT_SUCCESS);
  }
  else
  {
  waitpid( childpid, &status, 0 );
  puts( "in parent" );
  printf( "\tparent pid = %d\n", getpid() );
  printf( "\tparent ppid = %d\n", getppid() );
  printf( "\tchild process exited with status %d \n", status );
  }
  exit(EXIT_SUCCESS);
  }
  [
[email protected]
src]# gcc waitpid.c
  [[email protected] src]# ./a.out
  In child process
  child pid = 4469
  child ppid = 4468
  in parent
  parent pid = 4468
  parent ppid = 4379
  child process exited with status 0
  [[email protected] src]#
  如果將上面“waitpid( childpid, &status, 0 );”行註釋掉,程式執行效果如下:
  [
[email protected]
src]# ./a.out
  In child process
  in parent
  parent pid = 4481
  parent ppid = 4379
  child process exited with status 1331234400
  [[email protected] src]# child pid = 4482
  child ppid = 1
  子程序還沒有退出,父程序已經退出了。

相關推薦

Linux環境程式設計--waitpidforkexeclp

  waitpid(等待子程序中斷或結束)  表頭檔案  #include<sys/types.h>  #include<sys/wait.h>  定義函式 pid_t waitpid(pid_t pid,int * status,int options);  函式說明  waitpi

Linux 環境程式設計——淺談可重入函式不可重入函式

在實時系統的設計中,經常會出現多個任務呼叫同一個函式的情況。如果有一個函式不幸被設計成為這樣:那麼不同任務呼叫這個函式時可能修改其他任務呼叫這個函式的資料,從而導致不可預料的後果。這樣的函式是不安全的函式,也叫不可重入函式。 相反,肯定有一個安全的函式,這個安全的函式又叫可重入函式。那麼什麼是可

Linux 環境程式設計—可執行程式結構程序結構

Linux可執行檔案結構 在 Linux 下,程式是一個普通的可執行檔案,以下列出一個二進位制可執行檔案的基本情況: 可以看出,此可執行檔案在儲存時(沒有調入到記憶體前)分為程式碼區(text)、資料區(data)和未初始化資料區(bss)3 個部分。各段基本內容說明如下: 程式碼區:

Linux環境變量詳解應用

edi port exit 訪問 不能 但是 也有 文件 mman 在bash shell中,環境變量分為: >全局變量 >局部變量 全局變量,不僅對shell可見,對其子進程也可見 查看預設的全局環境變量: ghostwu@dev:~$ prin

Linux環境中GitHub的配置簡單使用教程

一.環境 1.1 作業系統(其他發行版亦可): [[email protected] ~]# cat /etc/centos-release CentOS Linux release 7.5.1804 (Core) 1.2 Git版本: [[email protected] ~]#

linux 環境下mysql的安裝配置

1,下載mysql源安裝包           wget http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm            2,安裝mysql源    yum localin

Linux環境下Redis的安裝配置

一、Linux環境下安裝Redis Redis的官方下載網址是:  (這裡下載的是Linux版的Redis原始碼包) Redis伺服器端的預設埠是6379。 這裡以虛擬機器中的Linux系統如何安裝Redis進行講解。 1. 在windows系統中下載好Redis的原始

Linux環境下OpenCV的安裝配置

Linux下OpenCV的安裝 1.cmake以及相關依賴庫的安裝 因為OpenCV2.2版本之後,需要用cmake來生成Makefile檔案,因此在安裝OpenCV之前,要安裝cmake以及cmake依賴庫。 終端輸入:apt-get install cmake apt-get i

Linux環境下makefile的建立編譯--簡單方法

Linux在命令列下敲寫Makefile檔案有時會顯得繁瑣且操作不便,因此我們可以採用在Windows下建立文字檔案(.txt)之後拖進VMware虛擬機器下的Linux系統。此時在命令列執行 make

linux —— shell 程式設計(整體框架基礎筆記)

導讀 關於shell程式設計基礎的學習,網上有很多資源,如果在校圖書館應該也有一些教程,所以這裡對於零碎的基礎不做詳細記錄,而只是對一些常用的概念、命令與操作做一個簡要的記錄,以備方便查詢。 (本文所有語句的測試均在 Ubuntu 16.04 LTS 上進行) 1

【Redis學習】:Linux環境下的Redis安裝配置

安裝環境 redis是C語言開發的,安裝redis需要先將官網上下載的原始碼進行編譯,編譯依賴gcc環境,如果沒有gcc環境,需要安裝gcc。這個最好使用yum安裝,因為依賴關係比較多,自己不好找

activemq使用系列: linux環境下ActiveMQ 的安裝使用(單節點)

1、 安裝 JDK 並配置環境變數(略) 2   下載 Linux 版的 ActiveMQ <span style="white-space:pre"> </span>wget http://apache.fayea.com/activemq/5.

Ubuntu Linux環境下git的安裝使用

簡介 GIt 相當於一個遠端倉庫,不當可以自動幫你記錄每次檔案的修改,也可以將檔案分享個別人一起寫作編輯; 不再需要自己管理一堆類似的檔案,也不需要把檔案傳來傳去,而且可以記錄每次檔案的改動,麻麻再也不用擔心我的報告丟掉啦! Git的安裝

Linux環境下FFMPEG的安裝配置

首先,安裝相關編碼器 lame-3.100.tar.gz tar -zxvf lame-3.100.tar.gz cd lame-3.100 ./configure make make install make clean libogg-1.3.3.tar.gz 

linux 程序建立clone、forkvfork

 目錄: 1、clone、fork與vfork介紹 2、fork說明 3、vfork說明 4、clone說明5、fork,vfork,clone的區別 內容: 1、clone、fork與vfork介

Linux環境下安裝TPC-H資料匯入PostgreSQL

總共需要以下10個步驟,不包括QGEN部分(經過賦值的22個SQL語句參考附錄)。 1. 下載 TPC-H 官方工具包,地址:http://www.tpc.org/tpc_documents_current_versions/current_specifications.

學習Linux C程式設計之預處理結構體

結構體的一般定義形式為:  struct 結構體名{     型別名1 成員名1;     型別名2 成員名2;     ……     型別名n 成員名n;    }; struct是關鍵字,是結構體型別的標誌。例如,定義一個Carstruct Car {    int wheels; // 輪子數    i

linux環境程式設計

問題一 提供給函式 ‘exit’ 的實參太少 https://zhidao.baidu.com/question/125845812.html 問題二 隱式宣告與內建函式’exit’不相容解決方案 問題三 什麼是waitpid https://www.systutoria

Linux 環境程式設計——訊號列表

在 Linux 下,每個訊號的名字都以字元 SIG 開頭,每個訊號和一個數字編碼相對應,在標頭檔案 signum.h 中,這些訊號都被定義為正整數。訊號名定義路徑:/usr/include/i386-linux-gnu/bits/signum.h 要想檢視這些訊號和編碼的對應關係,可使用命令:k

Linux 環境程式設計——淺談標準I/O緩衝區

標準I/O庫提供緩衝的目的是儘可能地減少使用read和write呼叫的次數。它也對每個I/O流自動地進行緩衝管理,從而避免了應用程式需要考慮這一點所帶來的麻煩。不幸的是,標準I/O庫最令人迷惑的也是它的緩衝。   標準I/O提供了三種類型的緩衝: 1、全緩衝: 在填滿標準I