linux下进程的创建有两种途径,一种是用一个进程来创建另一个进程,则这个创建的进程则作为父进程,被创建的进程将作为子进程。另一种方式就是由系统来创建,比如我们打开一个应用程序,这时的进程则由系统来创建。在进程被创建之后就要为其分配一定的资源。在系统运行时就创建了几个进程,这几个进程被称为系统进程,以后的创建的进程都是直接或间接的由它们来分配资源。一个进程创建之后系统就为其分配进程ID,当这个进程是由另一个进程创建时,则这个进程将继承其父进程的资源。注意子进程只继承父进程的资源,至于其它的像一些权限,和优先级,警告之类的则不继承。子进程被创建之后是和父进程的地位平等 的,即它们都争夺系统资源。
创建进程的函数为fork(),没有参数,有两个返回值。三种值返回。返回0表示返回是子进程调用fork()函数的返回值,如果返回的是子进程的pid 则表示是父进程在调用fork()函数进的返回,-1表示创建失败。我们可以认为在父进程调用fork()函数后,创建了子进程,子进程再次调用 fork()。所以fork()实际上是被调用了两次。但系统是如何区别是父进程还是子进程调用fork()函数,以便返回不同类型的值的呢。这是系统内 部的事,暂时我也不明白。
process.c
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main()
{
pid_t pid;
pid = fork();
switch(pid)
{
case 0:
printf("child process is runing, pid is : %d\n", getpid());
break;
case -1:
printf("create process faild!\n");
break;
default:
printf("parent process is runing, pid is : %d\n", getppid());
}
return 0;
}
#cc process.c -o cc process -g
#./process
由于子进程与父进程的优先级相同,所以它们应该是交替执行的。可以用下面的代码说明:
process.c
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main()
{
pid_t pid;
int i;
char *msg;
pid = fork();
switch(pid)
{
case 0:
msg = "child process is runing";
i=3;
break;
case -1:
printf("create process faild!\n");
break;
default:
msg = "parent process is runing";
i=5;
break;
}
while(i>0)
{
printf("prent pid : %d, chind pid : %d \n", getppid(), getpid());
puts(msg);
sleep(1);
printf("i : %d\n",i);
i--;
}
return 0;
}#cc process.c -o process -g
#./process
prent pid : 30478, chind pid : 32253
parent process is runing
prent pid : 32253, chind pid : 32254
child process is runing
i : 5
prent pid : 30478, chind pid : 32253
parent process is runing
i : 3
prent pid : 32253, chind pid : 32254
child process is runing
i : 4
prent pid : 30478, chind pid : 32253
parent process is runing
i : 2
prent pid : 32253, chind pid : 32254
child process is runing
i : 3
prent pid : 30478, chind pid : 32253
parent process is runing
i : 1
i : 2
prent pid : 30478, chind pid : 32253
parent process is runing
i : 1
孤儿进程是指父进程执行完毕后,父进程被kill这时子进程的getppid()返回的父进程的pid为1,这时子进程就成为孤儿了。孤儿进程由init里程收养。成为init的子进程。init的pid为1。
process.c
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main()
{
pid_t pid;
pid =fork();
switch(pid)
{
case 0:
while(1)
{
printf("a background process, PID : %d, parentID : %d\n", getpid(), getppid());
sleep(1);
}
break;
case 1:
printf("create child process faild!\n");
break;
default:
printf("I am parent proccess, my pid is %d \n", getpid());
break;
}
return 0;
}#cc process.c -o process -g
#./process
a background process, PID : 836, parentID : 835
I am parent proccess, my pid is 835 #a background process, PID : 836, parentID : 1
a background process, PID : 836, parentID : 1
a background process, PID : 836, parentID : 1
a background process, PID : 836, parentID : 1
a background process, PID : 836, parentID : 1
a background process, PID : 836, parentID : 1
a background process, PID : 836, parentID : 1
a background process, PID : 836, parentID : 1
这个程序运行后会一直执行, 这时可以打开另一个shell,用kill命令来kill它。
子进程与父进程相同的点主要有:相同的用户ID,相同的组ID。当前的工作目录,根目录,打开的文件,创建文件时使用的屏蔽字,信号屏蔽字,上下文环境,共享的存储段,资源限制....。