美文网首页
C语言进程的创建和回收

C语言进程的创建和回收

作者: itfitness | 来源:发表于2022-01-03 17:25 被阅读0次

进程的创建

使用的函数

Linux中使用C语言进行进程的创建使用fork()函数,该函数返回一个pid_t类型的值,该返回值如果为-1的话表示创建进程失败,为0的话表示子进程,大于0的话表示创建成功并且该值为子进程pid,所创建的进程是与父进程一样,执行到的位置也一样(除了fork的返回值、pid、ppid不一样,未决信号和文件锁不继承,资源利用量清零)

代码展示

下面是创建进程的代码展示:

#include<stdio.h>
#include<stdlib.h>
#include <sys/types.h>
#include <unistd.h>

int main(){

    pid_t pid;

    //打印当前进程的进程号和Begin!
    printf("[%d]:Begin!\n",getpid());

    pid = fork();

    if(pid < 0){
        printf("Create Fail\n");
        exit(1);
    }else if (pid == 0)
    {
        //打印子进程的进程号和Child is working
        printf("[%d]:Child is working!\n",getpid());
    }else{
        //打印子进程的进程号和Parent  is working
        printf("[%d]:Parent is working!\n",getpid());
    }
    

    printf("[%d]:End!\n",getpid());

    exit(0);
}
执行结果
补充

可以看到上面的执行结果是有些问题的,正确的应该是Begin!只执行一次,出错的原因是因为我当前的VSCode的终端是全缓冲机制,而在创建子线程之前我没有将所有的流刷新导致的在创建的子进程中依旧含有未刷新的数据,解决方法只需要在创建子进程之前加一句刷新流的代码即可,如下:

#include<stdio.h>
#include<stdlib.h>
#include <sys/types.h>
#include <unistd.h>

int main(){

    pid_t pid;

    printf("[%d]:Begin!\n",getpid());
    //刷新所有流
    fflush(NULL);

    pid = fork();

    if(pid < 0){
        printf("Create Fail\n");
        exit(1);
    }else if (pid == 0)
    {
        printf("[%d]:Child is working!\n",getpid());
    }else{
        printf("[%d]:Parent is working!\n",getpid());
    }
    

    printf("[%d]:End!\n",getpid());

    exit(0);
}

执行结果如下


进程的回收

进程的回收通过wait()waitpid()两个函数实现,但是每次只能回收一个子进程,如果创建了多个子进程的话需要调用多次,如下:

#include<stdlib.h>
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<sys/wait.h>

#define START 0
#define END 10
#define PNUM  3 //创建3个子进程执行任务

int main(){
    
    pid_t pid;
    int child_process_count = 0;
    for(int n = 0 ; n < PNUM ; n++){
        fflush(NULL);
        pid = fork();
        if(pid < 0){
            //假如创建进程失败就回收之前创建的子进程,并且退出
            for(int j = 0 ; j < child_process_count ; j++){
                wait(NULL);
            }
            exit(1);
        }
        if(pid == 0){
            for(int i = START + n;i < END ; i+=PNUM){
                printf("[%d]我打印:%d\n",getpid(),i);
            }
            sleep(1000);
            exit(0);
        }else{
            child_process_count++;
        }
    }
    //最后要回收所有子进程
    for(int j = 0 ; j < child_process_count ; j++){
        wait(NULL);
    }
    exit(0);
}

具体两个参数的解释可以参考下这篇文章:https://blog.csdn.net/csdn_kou/article/details/81091191
或者是自己查看man手册(需要在Linux环境下):

$man wait

相关文章

  • C语言进程的创建和回收

    进程的创建 使用的函数 Linux中使用C语言进行进程的创建使用fork()函数,该函数返回一个pid_t类型的值...

  • 玩懂Python垃圾回收机制,又有时间可以摸鱼了

    人生苦短,只谈风月,谈什么垃圾回收。 我们写过C语言、C++的朋友都知道,我们的C语言是没有垃圾回收这种说法的。手...

  • java 垃圾回收机制

    垃圾回收机制是java语言的特性之一,java 是C++语言之后 诞生的语言,垃圾回收机制就相当于解决了C++语言...

  • android--垃圾回收与内存优化

    什么是垃圾回收 对比C/C++这种需要自己管理内存的语言 java可以实现自动内存管理和回收 垃圾回收器负责回收程...

  • 线程的创建和控制

    线程的创建和控制 进程和线程的关系:进程提供资源,线程使用资源完成工作 创建线程函数 线程的控制 更多的API 创...

  • C++/CLI中的确定性垃圾回收与mdl.net中Element

    C++/CLI中的确定性垃圾回收 托管语言中自动垃圾回收导致回收的时机是不确定的,只有托管C++实现了确定性的回收...

  • 3.1.2 JVM性能调优-垃圾回收机制

    什么是垃圾回收机制 C/C++语言 是手动来回收堆内存里不再使用的对象,而JAVA则是由JVM来自动回收 如何确定...

  • C语言 目标文件和可执行文件(ELF文件)

    1.C语言创建程序 1.1C语言创建(分为4个步骤) 编辑 编译 链接 执行 编辑:就是创建和修改C程序的源代码-...

  • GC基础

    1.什么是垃圾 C语言申请内存:malloc free C++: new delete c/C++ 手动回收内存 ...

  • GO语言-GC

    引言 垃圾回收机制是高级语言常见的一类内存资源管理方式,C/C++这类语言内存分配及回收很大的主动权在调用者,gc...

网友评论

      本文标题:C语言进程的创建和回收

      本文链接:https://www.haomeiwen.com/subject/wmgxcrtx.html