有些汗顏~,一年半都沒有更新了,來了一家新單位,做了自己如願以償的嵌入式,回過頭來想想,其實也沒什麼的;
這次我繼續,深入淺出的unix環境高級編程系列,希望能堅持下去:)
1、程序和進程
其實這兩個概念很好解釋,程序是存儲在磁盤上的可執行文件;進程是這個可執行文件運行起來再內存中的狀態;
舉一個不太形象的例子吧;程序和進程的關系像汽車,汽車停在車庫就是程序,跑起來的狀態就是進程了;
2、進程號PID
在unix和類Unix系統中用進程號標識一個進程;是個非負整數;
可以寫一個簡單的程序打印一下PID的值,代碼如下:
編譯語句是gcc -o pid pid.c
- #include
- #include
- #include
- int main(int argc, char * argv[])
- {
- pid_t pid = 0;
- pid = getpid();
- printf("this proccess id is %d\n", pid);
- return 0;
- }
看著樣子是每次的PID都不大一樣;這樣可以保證每次啟動的時候檢查一下是不是已經啟動了這個程序了;一般講pid存儲成一個.pid的文件,來檢測是否已經啟動這個程序了;
- ./pid
- this proccess id is 24047
- ./pid
- this proccess id is 24048
- ./pid
- this proccess id is 24050
- ./pid
- this proccess id is 24051
- # ./pid
- this proccess id is 24052
運行程序之後會在當前目錄創建一個freesir.pid的文件,如果多次運行會報已經運行的錯誤;大概就是這樣子啦;
- #include
- #include
- #include
- #include
- #include
- #include
- int main(int argc, char * argv[])
- {
- pid_t pid = 0;
- char * pidfile = "./freesir.pid";
- pid = getpid();
- int fd = 0;
- char pids[16] = {0};
- if(access(pidfile, F_OK) != -1)
- {
- printf("this program is already run in system.\n");
- return -1;
- }
- fd = open(pidfile, O_TRUNC | O_CREAT | O_RDWR);
- if(fd < 0)
- {
- printf("open pid file error!\n");
- return -2;
- }
- sprintf(pids, "%d", pid);
- if(write(fd, pids, strlen(pids)) != strlen(pids))
- {
- printf("write pid file error!\n");
- return -3;
- }
- sleep(10);
- unlink(pidfile);
- close(fd);
- printf("this proccess id is %d\n", pid);
- return 0;
- }
上面的程序會打印父子進程的pid,可以看得出來,子進程是返回的0,且可以用getpid獲取他的子進程ID;父進程返回的是子進程的PID;
- #include
- #include
- #include
- int main(int argc, char * argv[])
- {
- pid_t pid = 0;
- int status = 0;
- pid = fork();
- if(pid < 0)
- {
- printf("fork error!\n");
- return 0;
- }
- else if(pid == 0)
- {
- printf("i'm the child proccess. pid = %d\n", getpid());
- sleep(5);
- exit(127);
- }
- else if(pid > 0)
- {
- printf("i'm parent prccess. pid = %d, childpid = %d\n", getpid(), pid);
- }
- pid = waitpid(pid, &status, 0);
- if(pid < 0)
- {
- printf("waitpid error!\n");
- }
- return 0;
- }
這些以後可以在寫,不展開啦;
- WIFEXITED(status)
- WEXITSTATUS(status)
- WIFSTOPPED(status)