Linux進程創建方法
system 創建進程
在一個程序內部啓動一個程序,從而創建一個新進程
運行以字符串參數的形式傳遞給他的命令並等待該命令的完成
使用頭文件和函數參數
#include<stdlib.h>
int system(const char* string);
#include<stdlib.h>
#include<stdio.h>
int main()
{
printf("Running ps with system\n");
system("ps ax");
printf("Done.\n");
exit(0);
}
execl 替換進程
#include<unistd.h>
execl
execlp
execle
execv
execvp
execve
6種寫了常見的2種
#include<stdio.h>
#include<string.h>
#include<unistd.h>
int main(int argc,char *argv[],char *envp[])
{
if(strcmp(argv[1],"execl"))
{
printf(" argv = %s\n",argv[1]);
printf("execl!\n");
execl("/usr/bin/ps","ps",0);
printf("this is word next execl")
}
else
{
printf(" argv = %s\n",argv[1]);
printf("execlp!\n");
execlp("ps","ps",0);
printf("this is word next execlp")
}
return 0;
}
替換進程後原進程的代碼不會執行 比如execl/execlp後面的printf
fork複製進程
這個系統調用複製當前進程 在進程表中創建一個新的表項,新的進程擁有自己的數據空間,環境和文件描述符
#include<sys/types.h>
#include<unistd.h>
pid_t fork(void);
父進程中fork調用返回了新的子進程的PID
新進程繼續執行 但是fork調用返回值爲0 由此判斷父子進程
失敗返回-1
1.子進程數目超過CHILD_MAX errno EAGAIN
2.進程表沒有足夠空間創建新的表單/虛擬內存不足 errno ENOMEM
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<stdlib.h>
int main()
{
pid_t pid;
char *message;
int n;
printf("fork program starting~\n");
pid = fork();
switch(pid)
{
case -1:
perror("fork failed");
exit(1);
case 0:
message = "This is the child";
n = 1;
break;
default:
message = "This is the parents";
n = 3;
break;
}
for(;n > 0;n--)
{
puts(message);
sleep(1);
}
exit(0);
}
wait等待進程
fork啓動一個子進程,子進程有了自己的生命週期獨立運行
父進程在子進程之前結束 子進程還在繼續運行
通過在父進程中調用wait讓父進程中調用wait函數讓父進程等待子進程結束
#include<sys/types.h>
#include<sys/wait.h>
pid_t wait(int *stat_loc);
wait系統調用將暫停父進程直到他的子進程結束爲止,這個調用返回子進程的PID,已經結束運行的子進程的PID。
狀態信息允許父進程瞭解子進程的退出狀態,子進程main函數返回的值/或exit中的退出碼,如果stat_loc不是空指針,狀態信息將被寫入他所在的位置
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>
int main()
{
pid_t cpid;
char* message;
int num;
int exit_code;
printf("fork program starting\n");
cpid = fork();
switch(cpid)
{
case -1:
perror("forl failed");
exit(1);
case 0:
message = "This is child";
num = 9;
exit_code = 10;
break;
default:
message = "This is the parents";
num = 3;
exit_code = 0;
break;
}
for(;num>0;num--)
{
puts(message);
sleep(1);
}
if(cpid != 0)
{
int stat_val;
pid_t child_pid;
child_pid = wait(&stat_val);
printf("Children has finished : PID = %d\n",child_pid);
//normal exit
if(WIFEXITED(stat_val))
{
printf("child exit with code %d\n",WEXITSTATUS(stat_val));
}
else
{
printf("Child terminated abnormally\n");
}
}
exit(exit_code);
}
waitpid
等待某個特定進程結束
和wait一樣 會掛起調用進程
#include<sys/types.h>
#include<sys/wait.h>
pid_t waitpid(pid_t pid,int * stat_loc, int options);
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>
int main()
{
pid_t cpid;
printf("programing fork is begining!~\n");
cpid = fork();
switch(cpid)
{
case -1:
perror("fork failed~!\n");
exit(0);
case 0 :
sleep(10);
break;
default:
printf("im parent\n");
pid_t wpid;
wpid = waitpid(cpid, NULL, WNOHANG);
printf("child end pid = %s\n",wpid);
break;
}
exit(0);
}