1、编程时使用getpid函数获取自身的进程标识符,getppid获取父进程的进程标识符。
2、使用fork函数创建一个进程
fork进程函数的原型:
pid_t fork(void);
fork 函数调用成功,返回两次
返回值为0,代表当前进程是子进程;
返回值为非负数,代表当前进程是父进程
调用失败,返回-1
使用fork函数来判断父子进程
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
int main()
{
pid_t pid;
printf(" pid is :%d\n",getpid());
pid= fork();
if(pid >0)
printf("this is father print,pid=%d\n",getpid());
else if(pid == 0)
printf("this is child print, child pid is :%d\n",getpid());
return 0;
}
打印
pid is :18034
this is father print,pid=18034
this is child print, child is :18035
父子进程都会进行fork()函数下面的代码,因为他们的pid不同所以打印的结果不同。
程序通过fork调用返回确定进程,当用fork启动一个子进程时,子进程就有了它自己的生命周期并将独立运行。
我们可以通过fork创建一个新的进程,在调用fork时被分为两个独立的进程(复制一个新的进程)。新的进程几乎与原进程一摸一样,执行的代码也完全一样,但新进程有自己的数据空间、环境、和文件描述符。
如上图所示,在父进程中的fork调用返回的是新的子进程的pid,新的进程将会继续执行,就像原进程一样,不同之处在于,子进程中的fork调用返回d的是0。父子进程可以通过这一点判断谁是父进程,谁是子进程。
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
int main()
{
pid_t pid;
pid_t pid2;
pid_t retpid;
pid=getpid();
printf(" before fork pid=%d\n",pid);
retpid= fork();
pid2=getpid();
printf("after fork pid=%d\n",pid2);
if(pid == pid2)
printf("this is father print , retpid= %d\n",retpid);
else
printf("this is child print ,retpid=%d, child pid= %d\n",retpid,getpid());
return 0;
}
打印结果
before fork pid=3575
after fork pid=3575
this is father print , retpid= 3576
after fork pid=3576
this is child print ,retpid=0, child pid= 3576
1、查看进程
ps -aux | grep init top
2、c语言储存空间分配
代码段(if for) 数据段(初始化的变量)bss段(函数外未初始化的变量)、堆(mallco)、栈(函数参、以及返回值)
3、获取进程ID getpid() 定义 pid_t pid=getpid()
fork() 返回两次,子进程返回的是0,父进程返回的是 新子进程的进程ID