进程控制-创建子进程

如果进程是一辆车,那么至少有启动,运行,停止三种状态。不过,进程和车最大的不同是,进程是可以自我复制的,只要使用函数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.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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值