首页 > 系统相关 >crash —— 输出属于同一个进程的所有线程

crash —— 输出属于同一个进程的所有线程

时间:2023-12-06 16:46:17浏览次数:31  
标签:PIDTYPE task crash 同一个 signal pid current 线程 group

在创建进程或者线程的时候,会调用copy_process,可以看到如下逻辑:

	/* ok, now we should be set up.. */
	p->pid = pid_nr(pid);
	if (clone_flags & CLONE_THREAD) {
		p->group_leader = current->group_leader;
		p->tgid = current->tgid;
	} else {
		p->group_leader = p;
		p->tgid = p->pid;
	}
	......

	if (likely(p->pid)) {
		ptrace_init_task(p, (clone_flags & CLONE_PTRACE) || trace);

		init_task_pid(p, PIDTYPE_PID, pid);
		if (thread_group_leader(p)) {
			init_task_pid(p, PIDTYPE_TGID, pid);
			init_task_pid(p, PIDTYPE_PGID, task_pgrp(current));
			init_task_pid(p, PIDTYPE_SID, task_session(current));

			if (is_child_reaper(pid)) {
				ns_of_pid(pid)->child_reaper = p;
				p->signal->flags |= SIGNAL_UNKILLABLE;
			}
			p->signal->shared_pending.signal = delayed.signal;
			p->signal->tty = tty_kref_get(current->signal->tty);
			/*
			 * Inherit has_child_subreaper flag under the same
			 * tasklist_lock with adding child to the process tree
			 * for propagate_has_child_subreaper optimization.
			 */
			p->signal->has_child_subreaper = p->real_parent->signal->has_child_subreaper ||
							 p->real_parent->signal->is_child_subreaper;
			list_add_tail(&p->sibling, &p->real_parent->children);
			list_add_tail_rcu(&p->tasks, &init_task.tasks);
			attach_pid(p, PIDTYPE_TGID);
			attach_pid(p, PIDTYPE_PGID);
			attach_pid(p, PIDTYPE_SID);
			__this_cpu_inc(process_counts);
		} else {
			current->signal->nr_threads++;
			current->signal->quick_threads++;
			atomic_inc(&current->signal->live);
			refcount_inc(&current->signal->sigcnt);
			task_join_group_stop(p);
			list_add_tail_rcu(&p->thread_group,
					  &p->group_leader->thread_group);
			list_add_tail_rcu(&p->thread_node,
					  &p->signal->thread_head);
		}
		attach_pid(p, PIDTYPE_PID);
		nr_threads++;
	}

如果创建的是进程,那么task_struct的group_leader指向自己,如果创建的是线程,那么task_struct的group_leader指向这个进程的主线程,并且通过task_struct的thread_group成员将进程里的所有线程串起来,所以只要知道任意一个线程的tid,就可以使用下面的命令来输出一个进程里的所有线程的:

image

image

标签:PIDTYPE,task,crash,同一个,signal,pid,current,线程,group
From: https://www.cnblogs.com/pengdonglin137/p/17879873.html

相关文章

  • 剖析 Tomcat 线程池与 JDK 线程池的区别和联系
    文章目录引言JDK线程池Tomcat线程池Tomcat连接器Tomcat的`Executor`Tomcat线程池配置区别和联系区别联系结论......
  • kafka入门(三):kafka多线程消费
    kafka消费积压如果生产者发送消息的速度过快,或者是消费者处理消息的速度太慢,那么就会有越来越多的消息无法及时消费,也就是消费积压。消费积压时,可以使用多线程消费,提高消费速度。kafka多线程消费的代码:publicclassThirdMultiConsumerThreadDemo{publicstaticfinalS......
  • apiservice导致CrashLoopBackOff状态pod不停重启
     尝试解决:[root@master01KubeSphere]#kubectlgetapiservice 只需将这个状态异常api删掉[root@master01KubeSphere]#kubectldeleteapiservicev1beta1.metrics.k8s.ioapiservice.apiregistration.k8s.io"v1beta1.metrics.k8s.io"deleted最后将pod删掉,会自动重建......
  • C++_线程池代码看C++类-模板-标准库
    C++线程池线程池的组成部分:线程池管理器(ThreadPoolManager):用于创建并管理线程池工作线程(WorkThread):线程池中线程任务接口(Task):每个任务必须实现的接口,以供工作线程调度任务的执行。任务队列:用于存放没有处理的任务。提供一种缓冲机制。 通过新......
  • Java两个线程间如何进行数据交互
    共享变量:可以通过在两个线程中定义一个共享变量,然后使用synchronized(volatile)关键字确保线程安全,实现数据的读取和修改。publicclass共享变量01{privateintvalue;publicsynchronizedintgetValue(){returnvalue;}publicsynchronizedvo......
  • jmeter测试计划中的“独立运行每个线程组”Demo演示
    一:jmeter的运行顺序测试计划-->线程组其次执行顺序为:配置元件、前置处理器、定时器、取样器、后置处理器、断言、监听器当一个测试计划中有多个线程组,当多个线程组都是是执行状态时,就会用到测试计划中的“独立运行每个线程组”勾选框不勾选时的执行顺序如下:......
  • 原来这才是 JDK 推荐的线程关闭方式,别再乱用了!
    原文:juejin.cn/post/7291564831710445622JDK在线程的Stop方法时明确不得强行销毁一个线程,要优雅的退出线程。何谓优雅退出线程,即业务将进行中请求正确被处理,取消待执行请求,执行资源回收,最终ThreadRunablerun方法return结束执行。首先问为什么要退出一个线程,再提问如何退出......
  • 解决线程不安全
    1.破坏临界资源(临界资源破坏了原子性可见性有序性) 直接不使用临界资源2.只读  使用final,只读不写3.局部变量  每个线程的局部变量会存在栈帧中,会在每个线程的栈帧内存中被创建多份,因此不存在共享。ThreadLocal  ThreadLocal也就是线程本地变量。如果你创建了⼀......
  • 线程安全
    什么是线程安全:⼤⽩话:多线程下并发同时对共享数据进⾏读写,会造成数据混乱=线程不安全当多线程并发访问临界资源时,如果破坏其原⼦性、可⻅性、有序性,可能会造成数据不⼀致。临界资源:共享资源(同⼀对象)同时读写,⼀次仅允许⼀个线程使⽤,才可保证其正确性。原子性:单一,不可分割......
  • Python 多线程
    多线程类似于同时执行多个不同程序,多线程运行有如下优点:使用线程可以把占据长时间的程序中的任务放到后台去处理。用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度程序的运行速度可能加快在一些等待的任务实现上如用户输......