在下面的代码中,就我用valgrind检查,父和子中没有内存泄漏。
Child total heap usage: 1 allocs, 1 frees, 272 bytes allocated
Parent total heap usage: 2 allocs, 2 frees, 1,296 bytes allocated
我在这里有两个问题。 首先,没有为创建线程处理分配的内存?我没有加入儿童流程。不应该有内存泄漏吗?
#include <unistd.h>
#include <stdio.h>
#include <pthread.h>
void* foo(void* arg){
puts("hello, world!");
sleep(3);
return NULL;
}
int main(){
pthread_t thread;
pthread_create(&thread, NULL, foo, NULL);
switch(fork()){
case -1:
fprintf(stderr, "error\n");
break;
case 0:
fprintf(stderr, "%d child finished\n", getpid());
break;
default:
pthread_join(thread, NULL);
fprintf(stderr, "%d parent finished\n", getpid());
}
return 0;
}
第二个问题是,儿童中并不存在线索。但是当我改变代码时,pthread_join返回0(成功)。不应该在子进程中返回错误并设置errno吗?
int main(){
pthread_t thread;
pthread_create(&thread, NULL, foo, NULL);
switch(fork()){
case -1:
fprintf(stderr, "error\n");
break;
case 0:
fprintf(stderr, "%d child finished\n", getpid());
break;
default:
fprintf(stderr, "%d parent finished\n", getpid());
}
printf("%d\n", pthread_join(thread, NULL));
puts(strerror(errno));
return 0;
}
答案 0 :(得分:0)
fork()
导致整个过程被重复&#39; (实际上只是通过相同代码的另一行执行/处理)
所以父进程中的任何内容也都在子进程中
因此父和子都有线程运行。
因此,父母和孩子都需要拨打pthread_join()
调用fork()
之后的错误路径也有线程正在运行,所以它也应该调用pthread_join()
注意:调用pthread_create()
时,应始终检查返回的值以确保操作成功
注意:在调用fork()
时,父进程也应该调用wait()
或更好,waitpid()
因此子进程不会成为僵尸进程(现代操作系统会附加子进程)如果实际的父级在子级之前退出,则转到init()
进程。)