Linux開發_Linux下進程編程

      網友投稿 872 2025-03-31

      任務 1: 進程編程


      1.1 進程概念

      ./a.out //沒有運行之前就是靜態程序,運行之后就是一個進程

      怎么區分進程?能夠獨立運行的程序,main。

      每個進程都有自己唯一的PID號。

      命令行可以通過ps命令獲取后臺進程的PID號。

      1. ?示例:ps -e 查看后臺全部進程

      #include

      #include

      pid_t getpid(void); //獲取進程PID

      pid_t getppid(void);

      ? ?C語言代碼方式獲取PID

      #include

      #include

      #include

      int main(int argc,char **argv)

      {

      pid_t pid=getpid();

      printf("當前進程PID=%d ",pid);

      pid=getppid();

      printf("PPID=%d \n",pid);

      return 0;

      }

      1.2 進程的信號

      kill 命令功能:給程序發送信號。

      查看所有支持的信號:kill -l

      kill [-s signal|-p] [--] pid...

      kill -l [signal] :查看指定信號的幫助信息

      發送信號的方式:

      1. ?kill <進程PID> //默認發送的進程終止信號,示例: #kill 348374

      2. ?kill -s <具體信號> <進程的PID> 示例: #kill -s SIGINT 7646

      3. ?kill -<具體信號> <進程的PID > 示例: # kill -SIGINT 7734

      ? ?信號的捕獲

      #include

      typedef void (*sighandler_t)(int);

      sighandler_t signal(int signum, sighandler_t han-dler);

      參數:

      int signum :要捕獲的信號

      sighandler_t han-dler:函數指針

      ? ?信號的捕獲示例

      #include

      #include

      #include

      #include

      void sighandler(int sig)

      {

      printf("捕獲的信號值=%d\n",sig);

      }

      int main(int argc,char **argv)

      {

      //將指定信號綁定到指定的函數上

      signal(SIGINT,sighandler); //2

      signal(SIGIO,sighandler); //29

      signal(SIGSYS,sighandler); //31

      while(1)

      {

      sleep(5);

      }

      return 0;

      }

      linux系統和windows這些系統屬于非實時系統。

      ucos\uclinux系統屬于實時系統

      ? ?josb查看后臺運行的程序作業代號。

      ? ?fg 1 將后臺作業代號為1的程序切換到前臺運行

      ? ?當程序在前臺運行時,按下 ctrl+z 可以將程序放入后臺,并且暫停運行。

      ? ?bg 1 將后臺暫停的程序切換為運行狀態

      1.3 進程的創建

      #include

      #include

      #include

      #include

      int main(int argc,char **argv)

      {

      pid_t pid;

      pid=fork(); //創建一個新的進程

      if(pid==0) //子進程

      {

      printf("子進程pid=%d\n",getpid());

      }

      else if(pid>0) //父進程

      {

      printf("父進程pid=%d\n",getpid());

      }

      else //進程創建錯誤

      {

      printf("進程創建失敗!\n");

      }

      return 0;

      }

      fork 函數創建新進程本身屬于一個拷貝的過程。繼承功能!

      ? ?進程的退出

      #include

      #include

      #include

      #include

      #include

      void print(void);

      int main(int argc,char **argv)

      {

      print();

      printf("main函數執行!");

      return 0;

      }

      void print(void)

      {

      printf("子函數執行!");

      //return; //終止函數,會將緩沖區里的數據輸出

      //exit(0); //直接終止進程,會將緩沖區里的數據輸出

      _exit(0); //強制終止進程,銷毀緩沖區中的數據

      }

      ? ?查看僵尸進程:ps -aux

      ? ?查看系統的環境變量: env

      ? ?修改控制臺終端的環境變量:export PS1='[\u@\h \W \t]$'

      1.4 進程的執行

      #include

      int system(const char *command); // “ls -l” …..”cd”

      接收命令的返回值:

      #include

      int main(int argc,char **argv)

      {

      system("pwd >123.txt"); //獲取腳本或者其他程序的返回值

      return 0;

      }

      ? ?可變形參

      #include

      void func(int data,...);

      int main(int argc,char **argv)

      {

      int data=888;

      func(data,123,456,789,100);

      return 0;

      }

      void func(int data,...)

      {

      int i=0;

      int *p=&data;

      for(i=0;i<5;i++)

      {

      printf("%d\n",*p++);

      }

      }

      ? ?執行進程

      #include

      #include

      int main(int argc,char **argv)

      {

      execl("/bin/ls","ls","-l",NULL);

      printf("123\n");

      Linux開發_Linux下進程編程

      return 0;

      }

      #include

      #include

      int main(int argc,char **argv)

      {

      execlp("ls","ls","-l",NULL); //PATH=xxx:xxx:xxx:

      printf("123\n");

      return 0;

      }

      ? ?管道:FIFO--->先入先出

      通過命令行: mkfifo命令可以直接創建FIFO文件。

      無名管道的FIFO文件不是實體文件,存在內存中的。

      文件的方向: 即 fds[0]和讀端相對應, fds[1]和寫端相對應

      有名管道的FIFO文件是實體文件,存在硬盤中的。

      #include

      #include

      /*

      #include

      int pipe(int pipefd[2]);

      */

      int main(int argc,char **argv)

      {

      int pipefd[2];

      char buff[100];

      pipe(pipefd); //創建一個無名管道 [0]讀 [1]寫

      int pid=fork();

      if(pid) //父進程

      {

      while(1)

      {

      write(pipefd[1],"12345",6);

      sleep(1);

      }

      }

      else //子進程

      {

      while(1)

      {

      read(pipefd[0],buff,100);

      printf("buff=%s\n",buff);

      }

      }

      return 0;

      }

      1.5 練習

      1. 練習無名管道的通信,刪除指定目錄下的指定后綴的文件。

      要求:子進程負責遍歷文件,父進程就負責刪除文件。

      #include #include #include #include /* 無名管道: fds[0] 表示讀 fds[1] 表示寫 int dup2(int oldfd, int newfd); //實現文件描述符的重定向 示例: dup2(fds[1],1); //將本程序的標準輸出定義到管道的寫端 標準輸入:0 標準輸出:1 標準錯誤:2 */ int main(int argc,char **argv) { if(argc!=2) { printf("參數格式: ./app <傳入一個文件>\n"); exit(-1); //退出進程 } int fds[2]; //定義了管道文件 pipe(fds); //創建無名管道文件 char buff[100]; char cmd[100]; int status; int pid=fork(); int len; if(pid==0) //子進程,遍歷目錄,查找文件 { write(fds[1],argv[1],strlen(argv[1])); //寫入數據 /* 1. 定義一個二維數組,先將所有目錄遍歷完畢,將得到數據一次性寫過去 2. 遍歷一個就寫一個。(編寫一個應答機制) */ } else if(pid>0) //父進程,負責刪除文件 { len=read(fds[0],buff,100); buff[len]='\0'; strcpy(cmd,"rm "); strcat(cmd,"-rf "); strcat(cmd,buff); printf("cmd=%s\n",cmd); system(cmd); //執行最終的操作 wait(&status); //隨機等待一個子進程退出 } else { printf("進程創建失敗!\n"); exit(-1); } return 0; }

      2. 練習命名管道的通信,刪除指定目錄下的指定后綴的文件。

      要求:子進程負責遍歷文件,父進程就負責刪除文件。

      dup2(fd_pipe[1],1); //將子進程的標準輸出重定向到管道的寫端

      3. (擴展) 通過命名管道實現本地聊天室,一個終端界面表示一個用戶。

      注明: 就一個.c程序,運行一個就是一個新的用戶,每個進程之間通過命名管道通信。

      (1) 每次運行程序需要輸入用戶名創建用戶名。

      (2) 每個新加入一個用戶有歡迎提示,例如: 歡迎xxx加入xxx聊天室。

      (3) 可以互相發送內容,發送內容時的格式: <用戶名>: <實際內容>:<發送的時間>

      (4) 可以顯示在線人數。

      (5) 一個用戶發送內容,所有的用戶都可以顯示出來。

      (6) 通過一個文件保存聊天記錄。

      Linux 任務調度

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:excel表格公式不能計算的解決方案
      下一篇:追溯系統解決方案(4分鐘之前已更新)
      相關文章
      亚洲午夜理论片在线观看| 亚洲综合色丁香麻豆| 亚洲看片无码在线视频| 亚洲国产精品无码专区在线观看| 亚洲国产一区视频| 亚洲精品久久久www | 亚洲国产成人久久精品影视| 久久精品国产亚洲AV不卡| 亚洲一区无码精品色| 亚洲真人无码永久在线| 国产亚洲精品无码成人| 亚洲AV中文无码乱人伦下载| 亚洲AV无码乱码国产麻豆穿越| 日韩va亚洲va欧洲va国产| 亚洲成人午夜在线| 亚洲无删减国产精品一区| 亚洲第一区视频在线观看| 91亚洲性爱在线视频| 亚洲高清视频在线| 亚洲youwu永久无码精品 | 亚洲天堂一区二区| 亚洲成a人片在线观看播放| 亚洲一卡二卡三卡| 亚洲欧美成人一区二区三区| 亚洲AV成人一区二区三区观看| 国产精品亚洲专区一区| 亚洲女同成人AⅤ人片在线观看| 久久精品亚洲乱码伦伦中文| 亚洲无线观看国产精品| 久久精品国产精品亚洲色婷婷| 亚洲成人在线电影| 亚洲一区二区三区91| 亚洲精品GV天堂无码男同| 亚洲AV无码成H人在线观看| 国产中文在线亚洲精品官网| 亚洲成AV人片在线观看WWW| 亚洲第一页中文字幕| 亚洲kkk4444在线观看| 日本亚洲中午字幕乱码| 亚洲欧洲自拍拍偷午夜色无码| 亚洲天堂久久精品|