linux之fork函数
1.fork函数:创建子进程,通过fork函数的返回值区分父子进程
#include <sys/types.h>
#include <unistd.h>
pid_t fork(void);
返回值有2个:父进程执行到fork函数,创建了子进程,然后两个进程同时对fork做返回
(1)返回子进程的pid(进程id号,非负正数) -----------父进程
(2)返回0------------------------------------- 子进程
2.getpid函数:获得当前进程id号,哪个进程调用,就返回哪个进程的id
getppid函数:获取父进程的id
#include <sys/types.h>
#include <unistd.h>
pid_t getpid(void);
pid_t getppid(void);
fork创建单个子进程:fork.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
//进程共享
//由下面的结果可以看出,父子进程的全局变量是独享
int var = 34;
int main()
{
pid_t pid;
pid = fork();
if(pid ==-1){
perror("fork");
exit(1);
}
else if(pid > 0){
sleep(2);
var = 55;
printf("I'm parent , pid = %u, ppid = %u, var = %d\n", getpid(), getppid(),var);
}
else if(pid == 0){
var = 100;
//sleep(1);
printf("I'm child , pid = %u, ppid = %u, var = %d\n", getpid(), getppid(),var);
}
printf("var = %d\n", var);
return 0;
}
fork创建多个子进程:cycle_fork_test.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
//循环创建子进程
int main()
{
pid_t pid;
printf("xxxxxxxxxx\n");
int i;
//循环创建5个子进程
for(i=0;i<5;i++){
pid = fork();
if(pid == -1){
perror("fork error");
exit(1);
}
else if(pid == 0){
//子进程的出口是break
break;//为了不让创建的子进程继续创建子进程,跳出循环
}
}
if(i<5){//子进程
sleep(i);
printf("I'am %d child , pid = %u\n",i+1,getpid());
}
else{//父进程
sleep(i);
printf("I'm parent\n");
}
return 0;
}
结果: