程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> 深入淺出《Unix環境高級編程》:Unix基礎知識(三)

深入淺出《Unix環境高級編程》:Unix基礎知識(三)

編輯:關於PHP編程

深入淺出《Unix環境高級編程》:Unix基礎知識(三)


有些汗顏~,一年半都沒有更新了,來了一家新單位,做了自己如願以償的嵌入式,回過頭來想想,其實也沒什麼的;
這次我繼續,深入淺出的unix環境高級編程系列,希望能堅持下去:)

1、程序和進程
其實這兩個概念很好解釋,程序是存儲在磁盤上的可執行文件;進程是這個可執行文件運行起來再內存中的狀態;
舉一個不太形象的例子吧;程序和進程的關系像汽車,汽車停在車庫就是程序,跑起來的狀態就是進程了;
2、進程號PID
在unix和類Unix系統中用進程號標識一個進程;是個非負整數;
可以寫一個簡單的程序打印一下PID的值,代碼如下:

  1. #include
  2. #include
  3. #include

  4. int main(int argc, char * argv[])
  5. {
  6. pid_t pid = 0;
  7. pid = getpid();

  8. printf("this proccess id is %d\n", pid);
  9. return 0;
  10. }
編譯語句是gcc -o pid pid.c
執行結果是:
  1. ./pid
  2. this proccess id is 24047
  3. ./pid
  4. this proccess id is 24048
  5. ./pid
  6. this proccess id is 24050
  7. ./pid
  8. this proccess id is 24051
  9. # ./pid
  10. this proccess id is 24052
看著樣子是每次的PID都不大一樣;這樣可以保證每次啟動的時候檢查一下是不是已經啟動了這個程序了;一般講pid存儲成一個.pid的文件,來檢測是否已經啟動這個程序了;
改造了一下程序,如下:
  1. #include
  2. #include
  3. #include
  4. #include
  5. #include
  6. #include

  7. int main(int argc, char * argv[])
  8. {
  9. pid_t pid = 0;
  10. char * pidfile = "./freesir.pid";
  11. pid = getpid();
  12. int fd = 0;
  13. char pids[16] = {0};

  14. if(access(pidfile, F_OK) != -1)
  15. {
  16. printf("this program is already run in system.\n");
  17. return -1;
  18. }

  19. fd = open(pidfile, O_TRUNC | O_CREAT | O_RDWR);
  20. if(fd < 0)
  21. {
  22. printf("open pid file error!\n");
  23. return -2;
  24. }

  25. sprintf(pids, "%d", pid);

  26. if(write(fd, pids, strlen(pids)) != strlen(pids))
  27. {
  28. printf("write pid file error!\n");
  29. return -3;
  30. }

  31. sleep(10);

  32. unlink(pidfile);
  33. close(fd);
  34. printf("this proccess id is %d\n", pid);
  35. return 0;
  36. }
運行程序之後會在當前目錄創建一個freesir.pid的文件,如果多次運行會報已經運行的錯誤;大概就是這樣子啦;

3、進程控制
這裡就簡單介紹一下進程控制就好,unix環境高級編程後面會有更詳細的介紹;
示例代碼中只是寫了一個簡單的shell封裝,我們還是分別寫倆小程序單獨解釋吧;

  1. #include
  2. #include
  3. #include

  4. int main(int argc, char * argv[])
  5. {
  6. pid_t pid = 0;
  7. int status = 0;

  8. pid = fork();
  9. if(pid < 0)
  10. {
  11. printf("fork error!\n");
  12. return 0;
  13. }
  14. else if(pid == 0)
  15. {
  16. printf("i'm the child proccess. pid = %d\n", getpid());
  17. sleep(5);
  18. exit(127);
  19. }
  20. else if(pid > 0)
  21. {
  22. printf("i'm parent prccess. pid = %d, childpid = %d\n", getpid(), pid);
  23. }

  24. pid = waitpid(pid, &status, 0);
  25. if(pid < 0)
  26. {
  27. printf("waitpid error!\n");
  28. }
  29. return 0;
  30. }
上面的程序會打印父子進程的pid,可以看得出來,子進程是返回的0,且可以用getpid獲取他的子進程ID;父進程返回的是子進程的PID;
最後使用waitpid等待子進程退出;出錯了這裡只是簡單打印,其實是需要使用waitpid的三個宏來確性子進程的退出狀態的;

  1. WIFEXITED(status)
  2. WEXITSTATUS(status)
  3. WIFSTOPPED(status)
這些以後可以在寫,不展開啦;

今天就看這麼多吧,越看越覺得linux很強大,折服。。。。


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved