歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux 進程控制入門

Linux 進程控制入門

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