日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

Linux环境编程--waitpid与fork与execlp

發(fā)布時間:2023/11/27 生活经验 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux环境编程--waitpid与fork与execlp 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

waitpid

waitpid(等待子進(jìn)程中斷或結(jié)束)
  表頭文件
  #include<sys/types.h>
  #include<sys/wait.h>
  定義函數(shù) pid_t waitpid(pid_t pid,int * status,int options);
  函數(shù)說明
  waitpid()會暫時停止目前進(jìn)程的執(zhí)行,直到有信號來到或子進(jìn)程
  結(jié)束。如果在調(diào)用 wait()時子進(jìn)程已經(jīng)結(jié)束,則 wait()會立即
  返回子進(jìn)程結(jié)束狀態(tài)值。 子進(jìn)程的結(jié)束狀態(tài)值會由參數(shù) status 返回,
  而子進(jìn)程的進(jìn)程識別碼也會一起返回。如果不在意結(jié)束狀態(tài)值,則
  參數(shù) status 可以設(shè)成 NULL。參數(shù) pid 為欲等待的子進(jìn)程識別碼,
  其他數(shù)值意義如下:
  pid<-1 等待進(jìn)程組識別碼為 pid 絕對值的任何子進(jìn)程。
  pid=-1 等待任何子進(jìn)程,相當(dāng)于 wait()。
  pid=0 等待進(jìn)程組識別碼與目前進(jìn)程相同的任何子進(jìn)程。
  pid>0 等待任何子進(jìn)程識別碼為 pid 的子進(jìn)程。
  參數(shù) option 可以為 0 或下面的 OR 組合:
  WNOHANG 如果沒有任何已經(jīng)結(jié)束的子進(jìn)程則馬上返回, 不予以等待。
  WUNTRACED 如果子進(jìn)程進(jìn)入暫停執(zhí)行情況則馬上返回,但結(jié)束狀態(tài)不予以理會。
  子進(jìn)程的結(jié)束狀態(tài)返回后存于 status,底下有幾個宏可判別結(jié)束情況:
  WIFEXITED(status)如果子進(jìn)程正常結(jié)束則為非 0 值。
  WEXITSTATUS(status)取得子進(jìn)程 exit()返回的結(jié)束代碼,一般會先用 WIFEXITED 來判斷是否正常結(jié)束才能使用此宏。
  WIFSIGNALED(status)如果子進(jìn)程是因為信號而結(jié)束則此宏值為真
  WTERMSIG(status) 取得子進(jìn)程因信號而中止的信號代碼,一般會先用 WIFSIGNALED 來判斷后才使用此宏。
  WIFSTOPPED(status) 如果子進(jìn)程處于暫停執(zhí)行情況則此宏值為真。一般只有使用 WUNTRACED 時才會有此情況。
  WSTOPSIG(status) 取得引發(fā)子進(jìn)程暫停的信號代碼,一般會先用 WIFSTOPPED 來判斷后才使用此宏。
  如果執(zhí)行成功則返回子進(jìn)程識別碼(PID) ,如果有錯誤發(fā)生則返回
  返回值-1。失敗原因存于 errno 中。
  /******
  * waitpid.c - Simple wait usage
  *********/
  #include <unistd.h>
  #include <sys/types.h>
  #include <sys/wait.h>
  #include <stdio.h>
  #include <stdlib.h>
  int main( void )
  {
  pid_t childpid;
  int status;
  childpid = fork();
  if ( -1 == childpid )
  {
  perror( "fork()" );
  exit( EXIT_FAILURE );
  }
  else if ( 0 == childpid )
  {
  puts( "In child process" );
  sleep( 3 );//讓子進(jìn)程睡眠3秒,看看父進(jìn)程的行為
  printf("\tchild pid = %d\n", getpid());
  printf("\tchild ppid = %d\n", getppid());
  exit(EXIT_SUCCESS);
  }
  else
  {
  waitpid( childpid, &status, 0 );
  puts( "in parent" );
  printf( "\tparent pid = %d\n", getpid() );
  printf( "\tparent ppid = %d\n", getppid() );
  printf( "\tchild process exited with status %d \n", status );
  }
  exit(EXIT_SUCCESS);
  }
  [root@localhost src]# gcc waitpid.c
  [root@localhost src]# ./a.out
  In child process
  child pid = 4469
  child ppid = 4468
  in parent
  parent pid = 4468
  parent ppid = 4379
  child process exited with status 0
  [root@localhost src]#
  如果將上面“waitpid( childpid, &status, 0 );”行注釋掉,程序執(zhí)行效果如下:
  [root@localhost src]# ./a.out
  In child process
  in parent
  parent pid = 4481
  parent ppid = 4379
  child process exited with status 1331234400
  [root@localhost src]# child pid = 4482
  child ppid = 1
  子進(jìn)程還沒有退出,父進(jìn)程已經(jīng)退出了。

fork

fork()函數(shù),Linux系統(tǒng)調(diào)用
  頭文件:
  #include <unistd.h>
  函數(shù)定義:
  int fork( void );
  返回值:
  子進(jìn)程中返回0,父進(jìn)程中返回子進(jìn)程ID,出錯返回-1
  函數(shù)說明:
  一個現(xiàn)有進(jìn)程可以調(diào)用fork函數(shù)創(chuàng)建一個新進(jìn)程。由fork創(chuàng)建的新進(jìn)程被稱為子進(jìn)程(child process)。fork函數(shù)被調(diào)用一次但返回兩次。兩次返回的唯一區(qū)別是子進(jìn)程中返回0值而父進(jìn)程中返回子進(jìn)程ID。
  子進(jìn)程是父進(jìn)程的副本,它將獲得父進(jìn)程數(shù)據(jù)空間、堆、棧等資源的副本。注意,子進(jìn)程持有的是上述存儲空間的“副本”,這意味著父子進(jìn)程間不共享這些存儲空間,它們之間共享的存儲空間只有代碼段。
  示例代碼:
  #include <unistd.h>
  #include <stdio.h>
  int main(int argc, void ** argv )
  {
  int pid = fork();
  if(pid < 0 ) {
  // print("error!");
  } else if( pid == 0 ) {
  // print("This is the child process!");
  } else {
  // print("This is the parent process! child process id = %d", pid);
  }
  return 0;
  }

execlp

execlp(從PATH 環(huán)境變量中查找文件并執(zhí)行)
  相關(guān)函數(shù):
  fork,execl,execle,execv,execve,execvp
  表頭文件:
  #include<unistd.h>
  定義函數(shù):
  int execlp(const char * file,const char * arg,……);
  函數(shù)說明:
  execlp()會從PATH 環(huán)境變量所指的目錄中查找符合參數(shù)file的文件名,找到后便執(zhí)行該文件,然后將第二個以后的參數(shù)當(dāng)做該文件的argv[0]、argv[1]……,最后一個參數(shù)必須用空指針(NULL)作結(jié)束。
  返回值:
  如果執(zhí)行成功則函數(shù)不會返回,執(zhí)行失敗則直接返回-1,失敗原因存于errno 中。
  錯誤代碼 參考execve()。
  范例:
  /* 執(zhí)行l(wèi)s -al /etc/passwd execlp()會依PATH 變量中的/bin找到/bin/ls */
  #include<unistd.h>
  main()
  {
  execlp(“l(fā)s”,”ls”,”-al”,”/etc/passwd”,(char *)0);
  }
  執(zhí)行:
  -rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwd
  ————————————————————————————————add by love_aiqiu
  NAME
  execl, execlp, execle, execv, execvp - execute a file
  SYNOPSIS
  #include <unistd.h>
  extern char **environ;
  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[]);

總結(jié)

以上是生活随笔為你收集整理的Linux环境编程--waitpid与fork与execlp的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。