实验
// exec_thread_test.cpp
#include <iostream>
#include <unistd.h>
#include <pthread.h>
#include<sys/syscall.h>
using namespace std;
//由于pthread用户库内没有gettid()所以需要这个头文件以及下面的函数定义
pid_t gettid()
{
return syscall(SYS_gettid);
}
void* thread1(void *args) {
pthread_detach(pthread_self());
int n = 10;
while (1) {
cout << "i am pthread_id: " << pthread_self() << " thread_id: " << gettid() << endl;
sleep(2);
}
return nullptr;
}
void* thread2(void *args) {
pthread_detach(pthread_self());
while (1) {
cout << "i am pthread_id: " << pthread_self() << " thread_id: " << gettid() << endl;
sleep(2);
}
return nullptr;
}
int main() {
pthread_t tid;
pthread_create(&tid, nullptr, thread1, nullptr);
sleep(1);
pthread_create(&tid, nullptr, thread2, nullptr);
int n = 10;
while (n--) {
sleep(1);
}
execl("/home/xupeng/learn/test/mymain", "mymain", NULL);
return 0;
}
// mymain.cpp
#include <iostream>
#include <unistd.h>
#include <pthread.h>
#include<sys/syscall.h>
using namespace std;
//由于pthread用户库内没有gettid()所以需要这个头文件以及下面的函数定义
pid_t gettid()
{
return syscall(SYS_gettid);
}
int main() {
while (1) {
cout << "i am execed pthread_id: " << pthread_self() << " thread_id: " << gettid() << endl;
sleep(2);
}
return 0;
}
解释一下代码:
- 主线程创建两个子进程,相隔1秒
- 10s后,主线程进行程序替换,替换的进程为
mymain
从实验可以看出,主线程的tid为12287,两个子线程的tid为12288、12306。在被程序替换后,监听exec_thread_test
的shell没有了输出,监听mymain
的shell开始输出,且(ps -axj | grep main_pid效果 一样)只有主线程一个执行流,之前进程创建的子线程都被关闭了。