linux模拟多线程崩溃和多进程崩溃

智极拓荒说
• 阅读 2204

结论是:
多线程下如果其中一个线程崩溃了会导致其他线程(整个进程)都崩溃;
多进程下如果其中一个进程崩溃了对其余进程没有影响;

多线程

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <pthread.h>
#include <assert.h>

void *fun1(void *arg)
{
    printf("fun1 enter\n");
    while(1)
    {
        printf("%s\n", __FUNCTION__);
        usleep(1000 * 1000);
    }
    printf("fun1 exit\n");
    return ((void *)1);
}

void *fun2(void *arg)
{
    printf("fun1 enter\n");
    usleep(1000 * 3000);
    char * ptr = (char *)malloc(sizeof(char));
    printf("ptr1: 0x%x\n", ptr);
    ptr = NULL;
    printf("ptr2: 0x%x\n", ptr);
    free(ptr);
    memcpy(ptr, "123", 3);
    printf("ptr3: 0x%x\n", ptr);
    printf("fun2 exit\n");
    return ((void *)2);
}

int main(void)
{
    pthread_t tid1, tid2;
    int err;
    
    err = pthread_create(&tid1, NULL, fun1, NULL);
    assert(0 == err);
    err = pthread_create(&tid2, NULL, fun2, NULL);
    assert(0 == err);
    
    printf("main join ...\n");
//    getchar();
    pthread_join(tid1, NULL);
    pthread_join(tid2, NULL);
    
    return 0;
}

多进程

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <pthread.h>
#include <assert.h>

void fun(void *arg)
{
    printf("fun1 enter\n");
    usleep(1000 * 3000);
    char * ptr = (char *)malloc(sizeof(char));
    printf("ptr1: 0x%x\n", ptr);
    ptr = NULL;
    printf("ptr2: 0x%x\n", ptr);
    free(ptr);
    memcpy(ptr, "123", 3);
    printf("ptr3: 0x%x\n", ptr);
    printf("fun2 exit\n");
    return ;
}

int main(int argc, char *argv[])
{
    assert(2 == argc);
    pid_t pid;
    int i;
    for(i=0; i<atoi(argv[1]); i++)
    {
        pid = fork();
        if(0 > pid)
        {
            printf("fork error");
            exit(1);
        }
        else if(0 == pid)
        {
            printf("child pid is %lu\n", (unsigned long)getpid());
            fun(NULL);
            exit(0);
        }
    }
    
    printf("parent pid is %lu\n", (unsigned long)getpid());
    while(-1 != wait(NULL));        //等待所有子进程结束
    printf("main return\n");
    getchar();
    
    return 0;
}
点赞
收藏
评论区
推荐文章
20pzqm 20pzqm
3年前
【electron】ipc模块使用
electron进程模型electron使用多进程架构与chromium类似,electron使用多进程架构。单一进程架构能够节省资源,然而浏览器经常遇到恶意代码,可能导致进程崩溃,浏览器的多个页签公用一个进程必然会一损俱损,因此多进程架构更适合些()。在开发electron的过程中,我们主要接触两个进程:主进程mainprocess与渲染进程re
亚瑟 亚瑟
4年前
IO多路复用
用户空间和内核空间Userspace(用户空间):用户程序的运行空间Kernelspace(内核空间):Linux内核的运行空间当进程运行在内核空间时就处于内核态,当进程运行在用户空间时就处于用户态。为了安全,它们是隔离的,即使用户的程序崩溃了,内核也不受影响。Kernelspace可以执行任意
Wesley13 Wesley13
3年前
java多线程面试题_线程并发面试题
1、什么是线程?线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速。比如,如果一个线程完成一个任务要100毫秒,那么用十个线程完成改任务只需10毫秒。2、线程和进程有什么区别?线程是进程的子集,一个进程可以有很多线程,每条线程并行执行不
Stella981 Stella981
3年前
Python 多进程程批量爬取小
使用python多进程跑同样的代码。python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程。Python提供了非常好用的多进程包multiprocessing,只需要定义一个函数,Python会完成其他所有事情。借助这个包,可以轻松完成从单进程到并发执行的转换。multiproc
Stella981 Stella981
3年前
Gevent简明教程
1、前述进程线程协程异步并发编程(不是并行)目前有四种方式:多进程、多线程、协程和异步。多进程编程在python中有类似C的os.fork,更高层封装的有multiprocessing标准库多线程编程python中有Thread和threading异步编程在linux下主要有三种实现selec
Stella981 Stella981
3年前
SpringBatch系列之并发并行能力
1、概要大多数任务都能够通过简单的单进程单线程任务处理好,但是还有一大部分现实诉求无法满足。批量任务存在两种并行模式单进程、多线程多进程我们也可以细分为多线程Step(单进程)MultithreadStep并行Step(单进程)ParallelSteps对Step进行远程分块(
Wesley13 Wesley13
3年前
04.Android崩溃Crash库之Loop拦截崩溃和ANR
目录总结01.能否利用Looper拦截崩溃02.思考几个问题分析03.App启动时自动开启Looper04.拦截主进程崩溃前沿上一篇整体介绍了crash崩溃库崩溃重启,崩溃记录记录,查看以及分享日志等功能。项目地址:https://github.com/yangchong
Wesley13 Wesley13
3年前
Java总结:Java多线程
多线程作为Java中很重要的一个知识点,在此还是有必要总结一下的。Java给多线程编程提供了内置的支持。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。多线程是多任务的一种特别的形式,但多线程使用了更小的资源开销。这里定义和线程相关的另一个术语进程:一个进程包括由操作系统分配的内存空间,
Wesley13 Wesley13
3年前
Java线程与多线程
1线程与多线程1.1线程是什么?线程(Thread)是一个对象(Object)。用来干什么?Java线程(也称JVM线程)是Java进程内允许多个同时进行的任务。该进程内并发的任务成为线程(Thread),一个进程里至少一个线程。Java程序采用多线程方式来支持大量的并发请求处理,程序如果在
Wesley13 Wesley13
3年前
Java面试问题——线程全面详解总结
一、多线程是什么?为什么要用多线程?介绍多线程之前要介绍线程,介绍线程则离不开进程。首先进程 :是一个正在执行中的程序,每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元;线程:就是进程中的一个独立控制单元,线程在控制着进程的执行。一个进程中至少有一个进程。多线程:一个进程中不只有一
胖大海 胖大海
2年前
linux 僵尸进程处理
僵尸进程:就是已经结束了的进程,但是没有从进程表中删除,如果过多僵尸进程导致其他重要任务没有PID可用,进而导致系统崩溃。这是真实可能发生的,它有一定的概率,特别当存在一个编码糟糕的程序开始大量产生僵尸进程的时候,在这种情况下,找到并杀死僵尸进程是一个明智的做法。如何找到僵尸进程top命令用ps命令和grep命令寻找僵尸进程:psAostat,