C/C++代码中创建销毁进程【内附可执行源码注释完整】

发布于:2023-02-15 ⋅ 阅读:(557) ⋅ 点赞:(0)

🎂创建子进程

包含头文件

#include <unistd.h>

在代码中创建进程通过pid_t fork(void);函数就可以!!
来看代码例子吧👇(可以自己在Linux下运行)

fork_create.cpp

#include <unistd.h>
#include <stdio.h>
int main()
{
    pid_t fpid;//fpid表示fork函数返回的值
    int count=0;
    fpid=fork();//会返回两个fpid(一个对于子进程一个是对于父进程)
    if (fpid < 0)
        printf("error in fork!");
    else if (fpid == 0) {//对于子进程来说,pid会等于0
        printf("i am the child process, my process id is %d\n",getpid());
        printf("I’m children\n");
        count +=2;
        
    }
    else {
        printf("parent process return fpid:%d\n",fpid);//对于父进程会返回子进程的pid
        printf("i am the parent process, my process id is %d\n",getpid());
        printf("I’m parent.\n");
        count++;
    }
    printf("统计结果是: %d\n",count);
    return 0;
}

运行结果:
编译命令:gcc fork_create -o fork_create.exe
在这里插入图片描述
调用fork函数后,会创建一个子进程,并且父子两个进程都从fork处执行,fork函数有两个返回值,对于父进程会返回子进程的pid,此时pid会大于0,对于子进程来说,pid会等于0。

传统的linux操作系统以统一的方式对待所有的进程:子进程复制父进程所拥有的所有资源,这种方法使得创建进程非常非常非常慢,因为子进程需要拷贝父进程的所有的地址空间,那现代的操作系统,是如何处理的呢?主要有以下三种方式:

  • 写时复制(比如上述例子就输出了两个count的值,那是因为父子进程都进行了写操作,所以输出不同的值)
  • 轻量级进程允许父子进程共享每进程在内核的很多数据结构,比如地址空间、打开文件表和信号处理。
  • vfork系统调用创建的进程能共享其父进程的内存地址空间,为了防止父进程重写子进程需要的数据,阻塞父进程的执行,一直到子进程退出为止。

🚀销毁进程

exit所需要的头文件

#include <stdlib.h>

wait所需要的头文件

#include <sys/types.h>
#include <sys/wait.h>

要销毁子进程用exit(int)就可以了,我们可以通过wait方法获取出销毁进程所带的状态值(就是exit中所带的int)
看代码吧👇

fork_create_destroy.cpp

#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>
int main()
{
    pid_t fpid;//fpid表示fork函数返回的值
    int count = 0;
    int status = 0;
    fpid=fork();
    if (fpid < 0)
        printf("error in fork!");
    else if (fpid == 0) {
        printf("i am the child process, my process id is %d\n",getpid());
        printf("I’m children\n");
        count +=2;
        exit(2);//销毁子进程
    }
    else {
        printf("parent process return fpid:%d\n",fpid);
        printf("i am the parent process, my process id is %d\n",getpid());
        printf("I’m parent.\n");
        count++;
    }
    printf("统计结果是: %d\n",count);
    wait(&status);//返回进程挂掉的一个结构体(返回子进程exit带的结构体)
    printf("parent:status:%d\n",WEXITSTATUS(status));//如果要返回当时进程挂掉的值,需要加宏WEXITSTATUS,而且exit中所带的值得为正数
    return 0;
}

运行结果:
在这里插入图片描述

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到