進程相關函數
fork
創建一個子進程,子進程復制父進程的地址空間。父進程返回子進程PID,子進程返回0。
pid_t pid = fork();
if (pid == 0) { /* 子進程代碼 */ }
else { /* 父進程代碼 */ }
getpid
獲取當前進程的PID。
pid_t pid = getpid();
getppid
獲取父進程的PID。
pid_t ppid = getppid();
wait
阻塞等待任意子進程結束,返回終止子進程的PID。
int status;
pid_t child_pid = wait(&status);
waitpid
等待指定子進程結束,可設置非阻塞選項。
int status;
pid_t child_pid = waitpid(pid, &status, WNOHANG);
exit
正常終止進程,清理I/O緩沖區。
exit(0); // 0表示成功
_exit
立即終止進程,不清理緩沖區。
_exit(1); // 1表示失敗
作業:
1.創建一個進程扇
父
子1 ? ?子2 ? ?子3......
#include <myhead.h>int main(int argc, const char *argv[])
{pid_t pid1,pid2,pid3;if((pid1=fork())==0){//sleep(1);puts("這是子進程1!");}else if(pid1>0){if((pid2=fork())==0){//sleep(2);puts("這是子進程2!");}else if(pid2>0){if((pid3=fork())==0){//sleep(3);puts("這是子進程3!");}else if(pid3>0){puts("這是父進程!");//waitpid(pid3,NULL,0);}elseERROR_MSG("pid3=fork error");}elseERROR_MSG("pid2=fork error");}elseERROR_MSG("pid1=fork error");while(1);return 0;
}
運行結果:
2.創建一個進程鏈
父 ---- ?子 ---- ?孫 ?---- 曾孫
#include <myhead.h>int main(int argc, const char *argv[])
{pid_t pid1,pid2,pid3;if((pid1=fork())==0){if((pid2=fork())==0){if((pid3=fork())==0){puts("這是曾孫進程!");}else if(pid3>0){puts("這是孫子進程!");}elseERROR_MSG("pid3=fork error");}else if(pid2>0){puts("這是子進程!");}elseERROR_MSG("pid2=fork error");}else if(pid1>0){puts("這是父進程!");waitpid(pid3,NULL,0);}elseERROR_MSG("pid1=fork error");while(1);return 0;
}
運行結果:
3.牛客網