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

34次阅读

共计 1470 个字符,预计需要花费 4 分钟才能阅读完成。

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

多线程

#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;
}

正文完
 0