创建子进程方法
fork创建单个子进程
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main(int argc, char *argv[])
{
int var = 10;
pid_t pid;
//创建子进程,如果返回-1则失败,如果返回0则子进程,返回正数是父进程,
//并且他们有独立的空间
//子进程继承父进程的缓冲区
//如果子进程结束,不写wait则子进程是僵尸进程
//如果父进程结束子进程没有结束则是孤儿进程
pid = fork();
if(pid == -1)
{
perror("for");
return 0;
}
else if(pid == 0)
{
while(1)
{
printf("子进程:xxx!\n");
printf("%d\n", var);
sleep(1);
}
}
else if(pid > 0)
{
while(1)
{
printf("父进程:XXX!\n");
printf("%d\n", var);
sleep(1);
}
}
return 0;
}
fork创建多个子进程
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main(int argc, char *argv[])
{
int var = 10;
pid_t pid, pid2;
//创建两个子进程的方法
//for(i = 0; i < 5; i++) pid = fork();创建31个子进程
pid = fork();
if(pid == -1)
{
perror("for");
return 0;
}
else if(pid == 0)
{
}
else if(pid > 0)//父进程
{
pid2 = fork();
if(pid2 == -1)
{
perror("for");
return 0;
}
else if(pid2 == 0)
{
}
else if(pid2 > 0)
{
}
}
return 0;
}
vfork创建子进程
//vfork先执行子进程,当子进程调用exec或exit后才执行父进程
//vfork在子进程调用exec之前在父进程地址运行,之后在子进程地址运行
//子进程执行之前父进程挂起
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int var = 0;
int main(int argc, char *argv[])
{
pid_t pid;
int num = 0;
pid = vfork();
if(pid == -1)
{
perror("vfork");
}
else if(pid == 0)
{
int i = 0;
for(i = 0; i < 3; i++)
{
printf("은.\n");
}
_exit(0);
}
else if(pid > 0)
{
int i = 0;
for(i = 0; i < 3; i++)
{
printf("인.\n");
sleep(1);
}
}
return 0;
}
获得进程号
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
//查看进程号
int main(int argc, char *argv[])
{
pid_t pid, ppid, pgid;
pid = getpid();
ppid = getppid();
pgid = getpgid(pid);
printf("pid = %d\n", pid);
printf("ppid = %d\n", ppid);
printf("pgid = %d\n", pgid);
printf("我的理想");
return 0;
}
执行结果