如果进程是一辆车,那么至少有启动,运行,停止三种状态。不过,进程和车最大的不同是,进程是可以自我复制的,只要使用函数fork就可以像孙悟空一样再变出一个自己。不过世界上没有两个完全一样的东西,变出来的这个进程,拥有属于自己的ID号(pid),自己的年龄(运行时间)。这些都与父进程不同。
kill 5013
通过getpid进程这辆车还可以获取自己的车牌号,getppid可以获取父进程的pid。
那么父进程不可以获取子进程的pid呢?只有通过fork的返回值了。
#include<sys/types.h>
//pid_t 这个类型是定义这个头文件里面的
//./usr/include/sys/types.h
#include<stdio.h>
int main()
{
pid_t pid;
pid = fork();
//fork从子进程和父进程都有一个返回值
//他在子进程中返回一个0
//在父进程中返回子进程的pid
if(pid<0)
{
printf("fork error!\n");
exit(1);
}
else if(pid==0)
{
printf("我是子进程!PID=[%d] PPID=[%d] \n",getpid(),getppid());
}else
{
printf("我是父进程!PID=[%d] PPID=[%d] \n",getpid(),getppid());
}
//getpid()获取本进程的PID
//getppid()获取本进程的父进程(parent)的PID
exit(0);
}
例2
#include<sys/types.h>
#include<stdio.h>
#include<fcntl.h>//这个头文件包含了操作file的函数
int main()
{
int fd = open("tmp.txt",O_RDWR);//以读写方式打开
if(fd < 0)
{
printf("打开文件失败\n");
}
pid_t pid;
pid = fork();
if(pid<0)
{
printf("fork error!\n");
exit(1);
}
else if(pid==0)//子进程追加内容
{
char string_tmp[10]="012345678";
write(fd,string_tmp,strlen(string_tmp));
}else//父进程文件偏移
{
if(lseek(fd,0L,2)<0)
{
printf("文件偏移失败\n");
exit(1);
}
}
close(fd);
exit(0);
}
僵尸进程
父进程还没结束,子进程就执行完了,但是父进程没有回收子进程的资源,这个时候,子进程就成了僵尸进程(他的生命已结束,但是还挂在那里)。
[back@dd ~]$ ps -ef|grep a.out
back 5013 3257 0 06:44 pts/0 00:00:00 ./a.out
back 5014 5013 0 06:44 pts/0 00:00:00 [a.out] <defunct>
back 5016 4987 0 06:45 pts/1 00:00:00 grep --color=auto a.out
kill 5013
wait可以预防僵尸进程的发生
#include<sys/types.h>
#include<stdio.h>
int main()
{
pid_t pid;
pid = fork();
if(pid < 0)
{
printf("创建子进程失败");
}else if(pid>0)
{
wait(0);//解决办法:wait可以让父进程回收子进程的资源
while(1)//让父进程一直循环
{
sleep(1);
}
}else
{
printf("子进程开始执行\n");
printf("子进程结束执行\n");
exit(1);
}
return 0;
}
孤儿进程,父进程结束,子进程还在运行,会被init收养。
#include<sys/types.h>
#include<stdio.h>
int main()
{
pid_t pid;
pid = fork();
if(pid < 0)
{
printf("创建子进程失败");
}else if(pid>0)
{
sleep(3);//休息一下
printf("child pid:%d,ppid:%d\n",getpid(),getppid());
exit(1);
}else
{
printf("child pid:%d,ppid:%d\n",getpid(),getppid());
}
sleep(7);//休息一下
printf("child pid:%d,ppid:%d\n",getpid(),getppid());
return 0;
}