进程控制-创建子进程

来源:互联网 发布:长城三公主知乎 编辑:程序博客网 时间:2024/05/01 16:32
如果进程是一辆车,那么至少有启动,运行,停止三种状态。不过,进程和车最大的不同是,进程是可以自我复制的,只要使用函数fork就可以像孙悟空一样再变出一个自己。不过世界上没有两个完全一样的东西,变出来的这个进程,拥有属于自己的ID号(pid),自己的年龄(运行时间)。这些都与父进程不同。
通过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.outback      5013  3257  0 06:44 pts/0    00:00:00 ./a.outback      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;}


0 0