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

多线程

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