歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> Linux教程

Linux 進程控制入門

本來想現在Linux上熟悉下進程的有關概念然後去寫windowsSDK的,沒想到今天Windows藍屏了,新升級的3.2.2內核打開虛擬機的時候還要升級內核。升就升吧,沒想到還錯誤了。沒辦法,看來只好在Linux上面待著了。

這幾天自己只是熟悉了下進程的概念,然後簡單的寫了一些小程序。自己寫點筆記免的忘掉。

進程標識符:Linux環境下進程啟動時候,系統分配給一個唯一的數值給每個進程,這個數值就稱為進程標識符。(感覺跟windows裡面的句柄有點像)

進程表示有進程號 PID 和 父進程號 PPID,都是非0整數

使用函數getpid獲得當前進程號,

函數原型Pid_t getpid(void);


使用函數getppid獲得當前進程的父進程號

函數原型Pid_t getppid(void);


下面介紹LinuxC下與進程相關的函數

exec函數族  在進程中啟動另一個程序執行

這個函數族有6個成員

exec函數族函數原型

#include <unistd.h>

int execl(const char *path, const char *arg, ...);

int execlp(const char *file, const char *arg, ...);

int execle(const char *path, const char *arg, ..., char *const envp[]);

int execv(const char *path, char *const argv[]);

int execvp(const char *file, char *const argv[]);

int execve(const char *path, char *const argv[], char *const envp[]);

其中只有execve是真正意義上的系統調用,其它都是在此基礎上經過包裝的庫函數。

system          在進程中開始另一個進程

       函數原型

       #i nclude<stdlib.h>
       int system(const char * string);

       函數說明
       system()會調用fork()產生子進程,由子進程來調用/bin/sh-c string來執行參數string字符串所代表的命令,此命>令執行完後隨即返回原調用的進程。在調用system()期間     SIGCHLD 信號會被暫時擱置,SIGINT和SIGQUIT 信號則會被忽略。
       返回值
        =-1:出現錯誤
        =0:調用成功但是沒有出現子進程
        >0:成功退出的子進程的id

fork                 從已存在的進程中復制一個新進程(這個進程叫做原來父進程的子進程)

        這是個關鍵的函數,理解了這個函數也就是進程入門了吧,呵呵

        廢話不多說,先來看看函數原型:

          #include<unistd.h>  

                #include<sys/types.h>  

          pid_t fork( void);   (pid_t 是一個宏定義,其實質是int 被定義在#include<sys/types.h>中)

返回值: 若成功調用一次則返回兩個值,子進程返回0,父進程返回子進程ID;否則,出錯返回-1   

函數說明:   一個現有進程可以調用fork函數創建一個新進程。由fork創建的新進程被稱為子進程(child process)。fork函數被調用一次但返回兩次。兩次返回的唯一區別是子進程中返回0值而父進程中返回子進程ID。   

子進程是父進程的副本,它將獲得父進程數據空間、堆、棧等資源的副本。注意,子進程持有的是上述存儲空間的“副本”,這意味著父子進程間不共享這些存儲空間。  

Linux將復制父進程的地址空間內容給子進程,因此,子進程有了獨立的地址空間。

我當初一直難以理解的fork函數的返回值。先看下示例代碼:

[cpp]

  1. #include <stdio.h>   
  2. #include <stdlib.h>   
  3. #include <unistd.h>   
  4. #include <sys/types.h>   
  5.   
  6. int main()  
  7. {  
  8.     //unsigned int result;     
  9.     pid_t result;  
  10.     result=fork();  
  11.     int newret;  
  12.     if (result==-1)  
  13.     {  
  14.         perror("創建子進程失敗");  
  15.         exit;  
  16.     }  
  17.     else if (result == 0)  
  18.     {  
  19.         printf("返回值是:%d,說明這是子進程!\n 此進程的進程號(PID)是:%d\n此進程的父進程號(PPID)是:%d\n",result,getpid(),getppid());  
  20.         newret = system("ls -l");  
  21.     }  
  22.     else  
  23.     {  
  24.         sleep(10);  
  25.         printf("返回值是:%d,說明這是父進程!\n 此進程的進程號(PID)是:%d\n此進程的父進程號(PPID)是:%d\n",result,getpid(),getppid());  
  26.         newret = system("ping www.baidu.com");  
  27.     }  
  28.     return 0;  
  29. }     
Copyright © Linux教程網 All Rights Reserved