[Linux Project] Linux Kernel Module for Listing Tasks

来源:互联网 发布:java面向对象设计原则 编辑:程序博客网 时间:2024/06/10 13:02
  • 这一次, 我们要编写一个能列出 Linux 系统中所有当前进程的内核模块.
  • Part 1. 线性遍历整个进程列表
  • 在 Linux 中, 进程控制块(PCB)的实现形式为内核结构体task_struct, 它被定义在头文件<Linux/sched.h>里. 在 Linux 中, 宏for_each_process()可以迭代系统中所有当前进程.
#include <linux/sched.h>struct task_struct *task;for_each_process(task) {  /* 每次迭代中, task 指向下一个任务(头节点为哨兵节点) */}
  • 把遍历的过程写在模块的入口函数里, 输出每个进程的名字(executable name), 状态(state)和进程 id 到内核日志, 并将输出内容和ps -el命令显示的内容相比对, 确认程序的正确性.
/* pa3.c */#include <linux/init.h>#include <linux/kernel.h>#include <linux/module.h>#include <linux/sched.h>int pa3_init(void) {  struct task_struct *task;  for_each_process(task) {    printk(KERN_INFO "task pid: %d, task state: %ld, task name: %s\n",     task->pid, task->state, task->comm);  }  return 0;}void pa3_exit(void) {  return ;}module_init(pa3_init);module_exit(pa3_exit);MODULE_LICENSE("GPL");MODULE_DESCRIPTION("PA3");MODULE_AUTHOR("AW");
obj-m += pa3.oall:  make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modulesclean:  make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
  • 总体来说比较简单, 照做就行了. 下面是ps -el命令和模块输出内容各自前若干行的比较.
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD4 S     0      1      0  0  80   0 - 29972 -      ?        00:00:06 systemd1 S     0      2      0  0  80   0 -     0 -      ?        00:00:00 kthreadd1 S     0      4      2  0  60 -20 -     0 -      ?        00:00:00 kworker/0:0H1 S     0      6      2  0  80   0 -     0 -      ?        00:00:00 ksoftirqd/01 S     0      7      2  0  80   0 -     0 -      ?        00:00:11 rcu_sched1 S     0      8      2  0  80   0 -     0 -      ?        00:00:00 rcu_bh1 S     0      9      2  0 -40   - -     0 -      ?        00:00:00 migration/01 S     0     10      2  0  60 -20 -     0 -      ?        00:00:00 lru-add-drain5 S     0     11      2  0 -40   - -     0 -      ?        00:00:00 watchdog/01 S     0     12      2  0  80   0 -     0 -      ?        00:00:00 cpuhp/01 S     0     13      2  0  80   0 -     0 -      ?        00:00:00 cpuhp/15 S     0     14      2  0 -40   - -     0 -      ?        00:00:00 watchdog/11 S     0     15      2  0 -40   - -     0 -      ?        00:00:00 migration/11 S     0     16      2  0  80   0 -     0 -      ?        00:00:00 ksoftirqd/11 S     0     18      2  0  60 -20 -     0 -      ?        00:00:00 kworker/1:0H5 S     0     19      2  0  80   0 -     0 -      ?        00:00:00 kdevtmpfs1 S     0     20      2  0  60 -20 -     0 -      ?        00:00:00 netns
[49946.111610] task pid: 1, task state: 1, task name: systemd[49946.111613] task pid: 2, task state: 1, task name: kthreadd[49946.111614] task pid: 4, task state: 1, task name: kworker/0:0H[49946.111615] task pid: 6, task state: 1, task name: ksoftirqd/0[49946.111616] task pid: 7, task state: 1, task name: rcu_sched[49946.111617] task pid: 8, task state: 1, task name: rcu_bh[49946.111618] task pid: 9, task state: 1, task name: migration/0[49946.111619] task pid: 10, task state: 1, task name: lru-add-drain[49946.111620] task pid: 11, task state: 1, task name: watchdog/0[49946.111621] task pid: 12, task state: 1, task name: cpuhp/0[49946.111621] task pid: 13, task state: 1, task name: cpuhp/1[49946.111622] task pid: 14, task state: 1, task name: watchdog/1[49946.111623] task pid: 15, task state: 1, task name: migration/1[49946.111624] task pid: 16, task state: 1, task name: ksoftirqd/1[49946.111625] task pid: 18, task state: 1, task name: kworker/1:0H[49946.111626] task pid: 19, task state: 1, task name: kdevtmpfs[49946.111627] task pid: 20, task state: 1, task name: netns
  • 第二部分要求用深度优先搜索的方法来打印当前进程信息, 为了解决这个问题, 我们同样可以从内核现有代码中寻求帮助.
  • 首先,在<linux/sched.h>中找到内核维护的进程树的根, 也就是 init 进程, 它作为struct task_struct *init_task;出现. 这也是我们 DFS 的根节点
  • 其次, 在struct task_struct的定义中我们发现每个进程控制块都维护了它的子进程的列表children和兄弟进程列表sibling. 这是 DFS 的迭代途径.
  • 然后, 我们找到定义在<linux/list.h>中的宏list_for_each()通过它我们可以迭代children列表.
  • 最后, 为了在chilren列表的元素中找到迭代对象, 我们使用list_entry()宏来提取信息.
  • 注意到内核中的链表都是带有空白节点的双向循环链表, 按照我下面的代码最终实现的是对内核当前进程以 init 进程为根的先根次序访问.
/* pa3.c */#include <linux/init.h>#include <linux/kernel.h>#include <linux/module.h>#include <linux/sched.h>#include <linux/list.h>void dfs(struct task_struct *parent) {  struct task_struct *task;  struct list_head *list;  list_for_each(list, &parent->children) {    task = list_entry(list, struct task_struct, sibling);    printk(KERN_INFO "task pid: %d, task ppid: %d, task ptask state: %ld, task name: %s\n",     task->pid, task_ppid_nr(task), task->state, task->comm);     dfs(task);  }}int pa3_init(void) {  printk(KERN_INFO "Part 1. Iterating over Tasks Linearly\n");  struct task_struct *task;  for_each_process(task) {    printk(KERN_INFO "task pid: %d, task state: %ld, task name: %s\n",     task->pid, task->state, task->comm);  }  printk(KERN_INFO "Part 2. Iterating over Tasks with a Depth-First Search Tree\n");  dfs(&init_task);  return 0;}void pa3_exit(void) {  return ;}module_init(pa3_init);module_exit(pa3_exit);MODULE_LICENSE("GPL");MODULE_DESCRIPTION("PA3");MODULE_AUTHOR("AW");
  • 结果输出在 Part 2 一行之后, 这里 Makefile 可以继续使用上一个.
  • 最终我在内核日志中查看到的输出如下:
[51592.439863] Part 2. Iterating over Tasks with a Depth-First Search Tree[51592.439865] task pid: 1, task ppid: 0, task ptask state: 1, task name: systemd[51592.439866] task pid: 351, task ppid: 1, task ptask state: 1, task name: systemd-journal[51592.439867] task pid: 370, task ppid: 1, task ptask state: 1, task name: systemd-udevd[51592.439867] task pid: 24031, task ppid: 370, task ptask state: 0, task name: systemd-udevd[51592.439868] task pid: 736, task ppid: 1, task ptask state: 1, task name: systemd-timesyn[51592.439869] task pid: 1025, task ppid: 1, task ptask state: 1, task name: vmhgfs-fuse[51592.439870] task pid: 1048, task ppid: 1, task ptask state: 1, task name: vmware-vmblock-[51592.439871] task pid: 1067, task ppid: 1, task ptask state: 1, task name: vmtoolsd[51592.439871] task pid: 1093, task ppid: 1, task ptask state: 1, task name: VGAuthService[51592.439872] task pid: 1143, task ppid: 1, task ptask state: 1, task name: ManagementAgent[51592.439873] task pid: 1147, task ppid: 1, task ptask state: 1, task name: systemd-logind[51592.439874] task pid: 1148, task ppid: 1, task ptask state: 1, task name: bluetoothd[51592.439874] task pid: 1149, task ppid: 1, task ptask state: 1, task name: cron[51592.439875] task pid: 1150, task ppid: 1, task ptask state: 1, task name: dbus-daemon[51592.439876] task pid: 1153, task ppid: 1, task ptask state: 1, task name: NetworkManager[51592.439877] task pid: 1353, task ppid: 1153, task ptask state: 1, task name: dnsmasq[51592.439878] task pid: 20428, task ppid: 1153, task ptask state: 1, task name: dhclient[51592.439878] task pid: 1154, task ppid: 1, task ptask state: 1, task name: rsyslogd[51592.439879] task pid: 1156, task ppid: 1, task ptask state: 1, task name: acpid[51592.439880] task pid: 1166, task ppid: 1, task ptask state: 1, task name: whoopsie[51592.439881] task pid: 1167, task ppid: 1, task ptask state: 1, task name: snapd[51592.439881] task pid: 1173, task ppid: 1, task ptask state: 1, task name: avahi-daemon[51592.439882] task pid: 1206, task ppid: 1173, task ptask state: 1, task name: avahi-daemon[51592.439883] task pid: 1182, task ppid: 1, task ptask state: 1, task name: ModemManager[51592.439884] task pid: 1183, task ppid: 1, task ptask state: 1, task name: accounts-daemon[51592.439902] task pid: 1184, task ppid: 1, task ptask state: 1, task name: thermald[51592.439904] task pid: 1270, task ppid: 1, task ptask state: 1, task name: polkitd[51592.439905] task pid: 1271, task ppid: 1, task ptask state: 1, task name: cups-browsed[51592.439905] task pid: 1272, task ppid: 1, task ptask state: 1, task name: irqbalance[51592.439906] task pid: 1287, task ppid: 1, task ptask state: 1, task name: lightdm[51592.439907] task pid: 1318, task ppid: 1287, task ptask state: 1, task name: Xorg[51592.439908] task pid: 1477, task ppid: 1287, task ptask state: 1, task name: lightdm[51592.439909] task pid: 1488, task ppid: 1477, task ptask state: 1, task name: upstart[51592.439910] task pid: 1571, task ppid: 1488, task ptask state: 1, task name: upstart-udev-br[51592.439910] task pid: 1577, task ppid: 1488, task ptask state: 1, task name: dbus-daemon[51592.439911] task pid: 1589, task ppid: 1488, task ptask state: 1, task name: window-stack-br[51592.439912] task pid: 1615, task ppid: 1488, task ptask state: 1, task name: upstart-file-br[51592.439913] task pid: 1613, task ppid: 1488, task ptask state: 1, task name: upstart-dbus-br[51592.439913] task pid: 1617, task ppid: 1488, task ptask state: 1, task name: upstart-dbus-br[51592.439914] task pid: 1618, task ppid: 1488, task ptask state: 1, task name: gnome-keyring-d[51592.439921] task pid: 1638, task ppid: 1488, task ptask state: 1, task name: gpg-agent[51592.439922] task pid: 1644, task ppid: 1488, task ptask state: 1, task name: bamfdaemon[51592.439923] task pid: 1645, task ppid: 1488, task ptask state: 1, task name: ibus-daemon[51592.439924] task pid: 1665, task ppid: 1645, task ptask state: 1, task name: ibus-dconf[51592.439924] task pid: 1671, task ppid: 1645, task ptask state: 1, task name: ibus-ui-gtk3[51592.439925] task pid: 1772, task ppid: 1645, task ptask state: 1, task name: ibus-engine-sim[51592.439926] task pid: 1654, task ppid: 1488, task ptask state: 1, task name: gvfsd[51592.439927] task pid: 1662, task ppid: 1488, task ptask state: 1, task name: gvfsd-fuse[51592.439928] task pid: 1676, task ppid: 1488, task ptask state: 1, task name: ibus-x11[51592.439928] task pid: 1686, task ppid: 1488, task ptask state: 1, task name: at-spi-bus-laun[51592.439929] task pid: 1700, task ppid: 1686, task ptask state: 1, task name: dbus-daemon[51592.439930] task pid: 1705, task ppid: 1488, task ptask state: 1, task name: hud-service[51592.439931] task pid: 1708, task ppid: 1488, task ptask state: 1, task name: unity-settings-[51592.439932] task pid: 1710, task ppid: 1488, task ptask state: 1, task name: at-spi2-registr[51592.439932] task pid: 1715, task ppid: 1488, task ptask state: 1, task name: gnome-session-b[51592.439933] task pid: 1891, task ppid: 1715, task ptask state: 1, task name: nautilus[51592.439934] task pid: 1926, task ppid: 1715, task ptask state: 1, task name: gnome-software[51592.439935] task pid: 1928, task ppid: 1715, task ptask state: 1, task name: polkit-gnome-au[51592.439936] task pid: 1932, task ppid: 1715, task ptask state: 1, task name: nm-applet[51592.439936] task pid: 1956, task ppid: 1715, task ptask state: 1, task name: unity-fallback-[51592.439937] task pid: 2257, task ppid: 1715, task ptask state: 1, task name: update-notifier[51592.439938] task pid: 2280, task ppid: 1715, task ptask state: 1, task name: deja-dup-monito[51592.439939] task pid: 1726, task ppid: 1488, task ptask state: 1, task name: unity-panel-ser[51592.439939] task pid: 1746, task ppid: 1488, task ptask state: 1, task name: dconf-service[51592.439940] task pid: 1784, task ppid: 1488, task ptask state: 1, task name: indicator-messa[51592.439941] task pid: 1785, task ppid: 1488, task ptask state: 1, task name: indicator-bluet[51592.439941] task pid: 1786, task ppid: 1488, task ptask state: 1, task name: indicator-power[51592.439942] task pid: 1787, task ppid: 1488, task ptask state: 1, task name: indicator-datet[51592.439962] task pid: 1790, task ppid: 1488, task ptask state: 1, task name: indicator-keybo[51592.439964] task pid: 1791, task ppid: 1488, task ptask state: 1, task name: indicator-sound[51592.439965] task pid: 1798, task ppid: 1488, task ptask state: 1, task name: indicator-print[51592.439965] task pid: 1800, task ppid: 1488, task ptask state: 1, task name: indicator-sessi[51592.439966] task pid: 1801, task ppid: 1488, task ptask state: 1, task name: compiz[51592.439967] task pid: 1806, task ppid: 1488, task ptask state: 1, task name: indicator-appli[51592.439968] task pid: 1845, task ppid: 1488, task ptask state: 1, task name: pulseaudio[51592.439969] task pid: 1867, task ppid: 1488, task ptask state: 1, task name: evolution-sourc[51592.439969] task pid: 1989, task ppid: 1488, task ptask state: 1, task name: vmtoolsd[51592.439970] task pid: 1982, task ppid: 1488, task ptask state: 1, task name: gvfs-udisks2-vo[51592.439971] task pid: 2005, task ppid: 1488, task ptask state: 1, task name: gvfs-gphoto2-vo[51592.439972] task pid: 2013, task ppid: 1488, task ptask state: 1, task name: gvfs-mtp-volume[51592.439972] task pid: 2018, task ppid: 1488, task ptask state: 1, task name: gvfs-goa-volume[51592.439973] task pid: 2026, task ppid: 1488, task ptask state: 1, task name: gvfs-afc-volume[51592.439974] task pid: 2041, task ppid: 1488, task ptask state: 1, task name: gconfd-2[51592.439975] task pid: 1960, task ppid: 1488, task ptask state: 1, task name: evolution-calen[51592.439976] task pid: 2054, task ppid: 1960, task ptask state: 1, task name: evolution-calen[51592.439976] task pid: 2088, task ppid: 1960, task ptask state: 1, task name: evolution-calen[51592.439977] task pid: 2063, task ppid: 1488, task ptask state: 1, task name: gvfsd-trash[51592.439978] task pid: 2087, task ppid: 1488, task ptask state: 1, task name: evolution-addre[51592.439979] task pid: 2102, task ppid: 2087, task ptask state: 1, task name: evolution-addre[51592.439980] task pid: 2117, task ppid: 1488, task ptask state: 1, task name: gvfsd-metadata[51592.439980] task pid: 2184, task ppid: 1488, task ptask state: 1, task name: sh[51592.439981] task pid: 2188, task ppid: 2184, task ptask state: 1, task name: zeitgeist-daemo[51592.439982] task pid: 2197, task ppid: 1488, task ptask state: 1, task name: zeitgeist-datah[51592.439983] task pid: 2195, task ppid: 1488, task ptask state: 1, task name: zeitgeist-fts[51592.439984] task pid: 2405, task ppid: 1488, task ptask state: 0, task name: gnome-terminal-[51592.439985] task pid: 2412, task ppid: 2405, task ptask state: 1, task name: bash[51592.439985] task pid: 24028, task ppid: 2412, task ptask state: 1, task name: sudo[51592.439986] task pid: 24030, task ppid: 24028, task ptask state: 0, task name: insmod[51592.439987] task pid: 4326, task ppid: 1488, task ptask state: 1, task name: unity-scope-hom[51592.439988] task pid: 4339, task ppid: 1488, task ptask state: 1, task name: unity-files-dae[51592.439989] task pid: 4338, task ppid: 1488, task ptask state: 1, task name: unity-scope-loa[51592.439989] task pid: 13517, task ppid: 1488, task ptask state: 1, task name: gvfsd-network[51592.439990] task pid: 13546, task ppid: 1488, task ptask state: 1, task name: gvfsd-dnssd[51592.439991] task pid: 14423, task ppid: 1488, task ptask state: 1, task name: notify-osd[51592.439992] task pid: 1321, task ppid: 1, task ptask state: 1, task name: agetty[51592.439993] task pid: 1401, task ppid: 1, task ptask state: 1, task name: tpvmlp[51592.439994] task pid: 1484, task ppid: 1, task ptask state: 1, task name: systemd[51592.439994] task pid: 1485, task ppid: 1484, task ptask state: 1, task name: (sd-pam)[51592.439995] task pid: 1736, task ppid: 1, task ptask state: 1, task name: upowerd[51592.439996] task pid: 1846, task ppid: 1, task ptask state: 1, task name: rtkit-daemon[51592.439997] task pid: 1909, task ppid: 1, task ptask state: 1, task name: colord[51592.439997] task pid: 1994, task ppid: 1, task ptask state: 1, task name: udisksd[51592.439998] task pid: 2036, task ppid: 1, task ptask state: 0, task name: fwupd[51592.440017] task pid: 2857, task ppid: 1, task ptask state: 1, task name: systemd-network[51592.440019] task pid: 2, task ppid: 0, task ptask state: 1, task name: kthreadd[51592.440020] task pid: 4, task ppid: 2, task ptask state: 1, task name: kworker/0:0H[51592.440021] task pid: 6, task ppid: 2, task ptask state: 1, task name: ksoftirqd/0[51592.440022] task pid: 7, task ppid: 2, task ptask state: 1, task name: rcu_sched[51592.440022] task pid: 8, task ppid: 2, task ptask state: 1, task name: rcu_bh[51592.440023] task pid: 9, task ppid: 2, task ptask state: 1, task name: migration/0[51592.440024] task pid: 10, task ppid: 2, task ptask state: 1, task name: lru-add-drain[51592.440025] task pid: 11, task ppid: 2, task ptask state: 1, task name: watchdog/0[51592.440026] task pid: 12, task ppid: 2, task ptask state: 1, task name: cpuhp/0[51592.440027] task pid: 13, task ppid: 2, task ptask state: 1, task name: cpuhp/1[51592.440027] task pid: 14, task ppid: 2, task ptask state: 1, task name: watchdog/1[51592.440028] task pid: 15, task ppid: 2, task ptask state: 1, task name: migration/1[51592.440029] task pid: 16, task ppid: 2, task ptask state: 1, task name: ksoftirqd/1[51592.440030] task pid: 18, task ppid: 2, task ptask state: 1, task name: kworker/1:0H[51592.440030] task pid: 19, task ppid: 2, task ptask state: 1, task name: kdevtmpfs[51592.440031] task pid: 20, task ppid: 2, task ptask state: 1, task name: netns[51592.440032] task pid: 22, task ppid: 2, task ptask state: 1, task name: khungtaskd[51592.440033] task pid: 23, task ppid: 2, task ptask state: 1, task name: oom_reaper[51592.440033] task pid: 24, task ppid: 2, task ptask state: 1, task name: writeback[51592.440034] task pid: 25, task ppid: 2, task ptask state: 1, task name: kcompactd0[51592.440035] task pid: 26, task ppid: 2, task ptask state: 1, task name: ksmd[51592.440036] task pid: 27, task ppid: 2, task ptask state: 1, task name: khugepaged[51592.440038] task pid: 28, task ppid: 2, task ptask state: 1, task name: crypto[51592.440039] task pid: 29, task ppid: 2, task ptask state: 1, task name: kintegrityd[51592.440039] task pid: 30, task ppid: 2, task ptask state: 1, task name: bioset[51592.440040] task pid: 31, task ppid: 2, task ptask state: 1, task name: kblockd[51592.440041] task pid: 32, task ppid: 2, task ptask state: 1, task name: ata_sff[51592.440042] task pid: 33, task ppid: 2, task ptask state: 1, task name: md[51592.440043] task pid: 34, task ppid: 2, task ptask state: 1, task name: devfreq_wq[51592.440043] task pid: 35, task ppid: 2, task ptask state: 1, task name: watchdogd[51592.440044] task pid: 39, task ppid: 2, task ptask state: 1, task name: kauditd[51592.440045] task pid: 40, task ppid: 2, task ptask state: 1, task name: kswapd0[51592.440045] task pid: 41, task ppid: 2, task ptask state: 1, task name: vmstat[51592.440046] task pid: 42, task ppid: 2, task ptask state: 1, task name: bioset[51592.440047] task pid: 43, task ppid: 2, task ptask state: 1, task name: ecryptfs-kthrea[51592.440048] task pid: 60, task ppid: 2, task ptask state: 1, task name: kthrotld[51592.440049] task pid: 61, task ppid: 2, task ptask state: 1, task name: acpi_thermal_pm[51592.440049] task pid: 62, task ppid: 2, task ptask state: 1, task name: bioset[51592.440050] task pid: 63, task ppid: 2, task ptask state: 1, task name: bioset[51592.440051] task pid: 64, task ppid: 2, task ptask state: 1, task name: bioset[51592.440052] task pid: 65, task ppid: 2, task ptask state: 1, task name: bioset[51592.440053] task pid: 66, task ppid: 2, task ptask state: 1, task name: bioset[51592.440053] task pid: 67, task ppid: 2, task ptask state: 1, task name: bioset[51592.440054] task pid: 68, task ppid: 2, task ptask state: 1, task name: bioset[51592.440055] task pid: 69, task ppid: 2, task ptask state: 1, task name: bioset[51592.440055] task pid: 70, task ppid: 2, task ptask state: 1, task name: bioset[51592.440076] task pid: 71, task ppid: 2, task ptask state: 1, task name: bioset[51592.440078] task pid: 72, task ppid: 2, task ptask state: 1, task name: bioset[51592.440079] task pid: 73, task ppid: 2, task ptask state: 1, task name: bioset[51592.440079] task pid: 74, task ppid: 2, task ptask state: 1, task name: bioset[51592.440080] task pid: 75, task ppid: 2, task ptask state: 1, task name: bioset[51592.440081] task pid: 76, task ppid: 2, task ptask state: 1, task name: bioset[51592.440081] task pid: 77, task ppid: 2, task ptask state: 1, task name: bioset[51592.440082] task pid: 78, task ppid: 2, task ptask state: 1, task name: bioset[51592.440083] task pid: 79, task ppid: 2, task ptask state: 1, task name: bioset[51592.440084] task pid: 80, task ppid: 2, task ptask state: 1, task name: bioset[51592.440084] task pid: 81, task ppid: 2, task ptask state: 1, task name: bioset[51592.440085] task pid: 82, task ppid: 2, task ptask state: 1, task name: bioset[51592.440086] task pid: 83, task ppid: 2, task ptask state: 1, task name: bioset[51592.440087] task pid: 84, task ppid: 2, task ptask state: 1, task name: bioset[51592.440087] task pid: 85, task ppid: 2, task ptask state: 1, task name: bioset[51592.440088] task pid: 86, task ppid: 2, task ptask state: 1, task name: scsi_eh_0[51592.440089] task pid: 87, task ppid: 2, task ptask state: 1, task name: scsi_tmf_0[51592.440090] task pid: 88, task ppid: 2, task ptask state: 1, task name: scsi_eh_1[51592.440091] task pid: 89, task ppid: 2, task ptask state: 1, task name: scsi_tmf_1[51592.440091] task pid: 94, task ppid: 2, task ptask state: 1, task name: ipv6_addrconf[51592.440092] task pid: 112, task ppid: 2, task ptask state: 1, task name: charger_manager[51592.440093] task pid: 159, task ppid: 2, task ptask state: 1, task name: scsi_eh_2[51592.440094] task pid: 160, task ppid: 2, task ptask state: 1, task name: mpt_poll_0[51592.440095] task pid: 161, task ppid: 2, task ptask state: 1, task name: mpt/0[51592.440096] task pid: 162, task ppid: 2, task ptask state: 1, task name: scsi_tmf_2[51592.440096] task pid: 163, task ppid: 2, task ptask state: 1, task name: scsi_eh_3[51592.440097] task pid: 164, task ppid: 2, task ptask state: 1, task name: scsi_tmf_3[51592.440098] task pid: 165, task ppid: 2, task ptask state: 1, task name: scsi_eh_4[51592.440099] task pid: 166, task ppid: 2, task ptask state: 1, task name: scsi_tmf_4[51592.440099] task pid: 167, task ppid: 2, task ptask state: 1, task name: scsi_eh_5[51592.440100] task pid: 168, task ppid: 2, task ptask state: 1, task name: scsi_tmf_5[51592.440101] task pid: 169, task ppid: 2, task ptask state: 1, task name: scsi_eh_6[51592.440102] task pid: 170, task ppid: 2, task ptask state: 1, task name: scsi_tmf_6[51592.440102] task pid: 171, task ppid: 2, task ptask state: 1, task name: scsi_eh_7[51592.440103] task pid: 172, task ppid: 2, task ptask state: 1, task name: scsi_tmf_7[51592.440104] task pid: 173, task ppid: 2, task ptask state: 1, task name: scsi_eh_8[51592.440105] task pid: 174, task ppid: 2, task ptask state: 1, task name: scsi_tmf_8[51592.440105] task pid: 175, task ppid: 2, task ptask state: 1, task name: scsi_eh_9[51592.440106] task pid: 176, task ppid: 2, task ptask state: 1, task name: scsi_tmf_9[51592.440107] task pid: 177, task ppid: 2, task ptask state: 1, task name: scsi_eh_10[51592.440108] task pid: 178, task ppid: 2, task ptask state: 1, task name: scsi_tmf_10[51592.440108] task pid: 179, task ppid: 2, task ptask state: 1, task name: scsi_eh_11[51592.440109] task pid: 180, task ppid: 2, task ptask state: 1, task name: scsi_tmf_11[51592.440110] task pid: 181, task ppid: 2, task ptask state: 1, task name: scsi_eh_12[51592.440111] task pid: 182, task ppid: 2, task ptask state: 1, task name: scsi_tmf_12[51592.440111] task pid: 183, task ppid: 2, task ptask state: 1, task name: scsi_eh_13[51592.440112] task pid: 184, task ppid: 2, task ptask state: 1, task name: scsi_tmf_13[51592.440133] task pid: 185, task ppid: 2, task ptask state: 1, task name: scsi_eh_14[51592.440134] task pid: 186, task ppid: 2, task ptask state: 1, task name: scsi_tmf_14[51592.440135] task pid: 187, task ppid: 2, task ptask state: 1, task name: scsi_eh_15[51592.440136] task pid: 188, task ppid: 2, task ptask state: 1, task name: scsi_tmf_15[51592.440136] task pid: 189, task ppid: 2, task ptask state: 1, task name: scsi_eh_16[51592.440137] task pid: 190, task ppid: 2, task ptask state: 1, task name: scsi_tmf_16[51592.440138] task pid: 191, task ppid: 2, task ptask state: 1, task name: scsi_eh_17[51592.440139] task pid: 192, task ppid: 2, task ptask state: 1, task name: scsi_tmf_17[51592.440139] task pid: 193, task ppid: 2, task ptask state: 1, task name: scsi_eh_18[51592.440140] task pid: 194, task ppid: 2, task ptask state: 1, task name: scsi_tmf_18[51592.440141] task pid: 195, task ppid: 2, task ptask state: 1, task name: scsi_eh_19[51592.440142] task pid: 196, task ppid: 2, task ptask state: 1, task name: scsi_tmf_19[51592.440142] task pid: 197, task ppid: 2, task ptask state: 1, task name: scsi_eh_20[51592.440143] task pid: 198, task ppid: 2, task ptask state: 1, task name: scsi_tmf_20[51592.440145] task pid: 199, task ppid: 2, task ptask state: 1, task name: scsi_eh_21[51592.440145] task pid: 200, task ppid: 2, task ptask state: 1, task name: scsi_tmf_21[51592.440146] task pid: 201, task ppid: 2, task ptask state: 1, task name: scsi_eh_22[51592.440147] task pid: 202, task ppid: 2, task ptask state: 1, task name: scsi_tmf_22[51592.440148] task pid: 203, task ppid: 2, task ptask state: 1, task name: scsi_eh_23[51592.440148] task pid: 204, task ppid: 2, task ptask state: 1, task name: scsi_tmf_23[51592.440149] task pid: 205, task ppid: 2, task ptask state: 1, task name: scsi_eh_24[51592.440150] task pid: 206, task ppid: 2, task ptask state: 1, task name: scsi_tmf_24[51592.440151] task pid: 207, task ppid: 2, task ptask state: 1, task name: scsi_eh_25[51592.440151] task pid: 208, task ppid: 2, task ptask state: 1, task name: scsi_tmf_25[51592.440152] task pid: 209, task ppid: 2, task ptask state: 1, task name: scsi_eh_26[51592.440153] task pid: 210, task ppid: 2, task ptask state: 1, task name: scsi_tmf_26[51592.440154] task pid: 211, task ppid: 2, task ptask state: 1, task name: scsi_eh_27[51592.440154] task pid: 212, task ppid: 2, task ptask state: 1, task name: scsi_tmf_27[51592.440155] task pid: 213, task ppid: 2, task ptask state: 1, task name: scsi_eh_28[51592.440156] task pid: 214, task ppid: 2, task ptask state: 1, task name: scsi_tmf_28[51592.440157] task pid: 215, task ppid: 2, task ptask state: 1, task name: scsi_eh_29[51592.440157] task pid: 216, task ppid: 2, task ptask state: 1, task name: scsi_tmf_29[51592.440158] task pid: 217, task ppid: 2, task ptask state: 1, task name: scsi_eh_30[51592.440159] task pid: 218, task ppid: 2, task ptask state: 1, task name: scsi_tmf_30[51592.440160] task pid: 219, task ppid: 2, task ptask state: 1, task name: scsi_eh_31[51592.440160] task pid: 220, task ppid: 2, task ptask state: 1, task name: scsi_tmf_31[51592.440161] task pid: 247, task ppid: 2, task ptask state: 1, task name: scsi_eh_32[51592.440162] task pid: 248, task ppid: 2, task ptask state: 1, task name: scsi_tmf_32[51592.440163] task pid: 249, task ppid: 2, task ptask state: 1, task name: bioset[51592.440163] task pid: 251, task ppid: 2, task ptask state: 1, task name: kworker/0:1H[51592.440164] task pid: 253, task ppid: 2, task ptask state: 1, task name: bioset[51592.440165] task pid: 255, task ppid: 2, task ptask state: 1, task name: ttm_swap[51592.440166] task pid: 314, task ppid: 2, task ptask state: 1, task name: jbd2/sda4-8[51592.440167] task pid: 315, task ppid: 2, task ptask state: 1, task name: ext4-rsv-conver[51592.440167] task pid: 416, task ppid: 2, task ptask state: 1, task name: nfit[51592.440168] task pid: 686, task ppid: 2, task ptask state: 1, task name: jbd2/sda1-8[51592.440169] task pid: 687, task ppid: 2, task ptask state: 1, task name: ext4-rsv-conver[51592.440189] task pid: 698, task ppid: 2, task ptask state: 1, task name: jbd2/sda3-8[51592.440190] task pid: 703, task ppid: 2, task ptask state: 1, task name: ext4-rsv-conver[51592.440191] task pid: 1887, task ppid: 2, task ptask state: 1, task name: krfcommd[51592.440192] task pid: 1973, task ppid: 2, task ptask state: 1, task name: kworker/1:1H[51592.440192] task pid: 20445, task ppid: 2, task ptask state: 1, task name: kworker/u257:0[51592.440193] task pid: 20446, task ppid: 2, task ptask state: 1, task name: hci0[51592.440194] task pid: 20447, task ppid: 2, task ptask state: 1, task name: hci0[51592.440195] task pid: 20449, task ppid: 2, task ptask state: 1, task name: kworker/u257:2[51592.440196] task pid: 21088, task ppid: 2, task ptask state: 1, task name: kworker/u256:1[51592.440197] task pid: 21491, task ppid: 2, task ptask state: 1, task name: kworker/1:2[51592.440197] task pid: 21581, task ppid: 2, task ptask state: 1, task name: kworker/u256:2[51592.440198] task pid: 21584, task ppid: 2, task ptask state: 1, task name: kworker/0:2[51592.440199] task pid: 22838, task ppid: 2, task ptask state: 1, task name: kworker/1:1[51592.440200] task pid: 22935, task ppid: 2, task ptask state: 1, task name: kworker/0:0[51592.440201] task pid: 23274, task ppid: 2, task ptask state: 1, task name: kworker/u256:0
  • 最后是很有趣的结构体, Linux 下进程控制块PCB的实现:
struct task_struct {#ifdef CONFIG_THREAD_INFO_IN_TASK    /*     * For reasons of header soup (see current_thread_info()), this     * must be the first element of task_struct.     */    struct thread_info thread_info;#endif    volatile long state;    /* -1 unrunnable, 0 runnable, >0 stopped */    void *stack;    atomic_t usage;    unsigned int flags; /* per process flags, defined below */    unsigned int ptrace;#ifdef CONFIG_SMP    struct llist_node wake_entry;    int on_cpu;#ifdef CONFIG_THREAD_INFO_IN_TASK    unsigned int cpu;   /* current CPU */#endif    unsigned int wakee_flips;    unsigned long wakee_flip_decay_ts;    struct task_struct *last_wakee;    int wake_cpu;#endif    int on_rq;    int prio, static_prio, normal_prio;    unsigned int rt_priority;    const struct sched_class *sched_class;    struct sched_entity se;    struct sched_rt_entity rt;#ifdef CONFIG_CGROUP_SCHED    struct task_group *sched_task_group;#endif    struct sched_dl_entity dl;#ifdef CONFIG_PREEMPT_NOTIFIERS    /* list of struct preempt_notifier: */    struct hlist_head preempt_notifiers;#endif#ifdef CONFIG_BLK_DEV_IO_TRACE    unsigned int btrace_seq;#endif    unsigned int policy;    int nr_cpus_allowed;    cpumask_t cpus_allowed;#ifdef CONFIG_PREEMPT_RCU    int rcu_read_lock_nesting;    union rcu_special rcu_read_unlock_special;    struct list_head rcu_node_entry;    struct rcu_node *rcu_blocked_node;#endif /* #ifdef CONFIG_PREEMPT_RCU */#ifdef CONFIG_TASKS_RCU    unsigned long rcu_tasks_nvcsw;    bool rcu_tasks_holdout;    struct list_head rcu_tasks_holdout_list;    int rcu_tasks_idle_cpu;#endif /* #ifdef CONFIG_TASKS_RCU */#ifdef CONFIG_SCHED_INFO    struct sched_info sched_info;#endif    struct list_head tasks;#ifdef CONFIG_SMP    struct plist_node pushable_tasks;    struct rb_node pushable_dl_tasks;#endif    struct mm_struct *mm, *active_mm;    /* per-thread vma caching */    u32 vmacache_seqnum;    struct vm_area_struct *vmacache[VMACACHE_SIZE];#if defined(SPLIT_RSS_COUNTING)    struct task_rss_stat    rss_stat;#endif/* task state */    int exit_state;    int exit_code, exit_signal;    int pdeath_signal;  /*  The signal sent when the parent dies  */    unsigned long jobctl;   /* JOBCTL_*, siglock protected */    /* Used for emulating ABI behavior of previous Linux versions */    unsigned int personality;    /* scheduler bits, serialized by scheduler locks */    unsigned sched_reset_on_fork:1;    unsigned sched_contributes_to_load:1;    unsigned sched_migrated:1;    unsigned sched_remote_wakeup:1;    unsigned :0; /* force alignment to the next boundary */    /* unserialized, strictly 'current' */    unsigned in_execve:1; /* bit to tell LSMs we're in execve */    unsigned in_iowait:1;#if !defined(TIF_RESTORE_SIGMASK)    unsigned restore_sigmask:1;#endif#ifdef CONFIG_MEMCG    unsigned memcg_may_oom:1;#ifndef CONFIG_SLOB    unsigned memcg_kmem_skip_account:1;#endif#endif#ifdef CONFIG_COMPAT_BRK    unsigned brk_randomized:1;#endif    unsigned long atomic_flags; /* Flags needing atomic access. */    struct restart_block restart_block;    pid_t pid;    pid_t tgid;#ifdef CONFIG_CC_STACKPROTECTOR    /* Canary value for the -fstack-protector gcc feature */    unsigned long stack_canary;#endif    /*     * pointers to (original) parent process, youngest child, younger sibling,     * older sibling, respectively.  (p->father can be replaced with     * p->real_parent->pid)     */    struct task_struct __rcu *real_parent; /* real parent process */    struct task_struct __rcu *parent; /* recipient of SIGCHLD, wait4() reports */    /*     * children/sibling forms the list of my natural children     */    struct list_head children;  /* list of my children */    struct list_head sibling;   /* linkage in my parent's children list */    struct task_struct *group_leader;   /* threadgroup leader */    /*     * ptraced is the list of tasks this task is using ptrace on.     * This includes both natural children and PTRACE_ATTACH targets.     * p->ptrace_entry is p's link on the p->parent->ptraced list.     */    struct list_head ptraced;    struct list_head ptrace_entry;    /* PID/PID hash table linkage. */    struct pid_link pids[PIDTYPE_MAX];    struct list_head thread_group;    struct list_head thread_node;    struct completion *vfork_done;      /* for vfork() */    int __user *set_child_tid;      /* CLONE_CHILD_SETTID */    int __user *clear_child_tid;        /* CLONE_CHILD_CLEARTID */    u64 utime, stime;#ifdef CONFIG_ARCH_HAS_SCALED_CPUTIME    u64 utimescaled, stimescaled;#endif    u64 gtime;    struct prev_cputime prev_cputime;#ifdef CONFIG_VIRT_CPU_ACCOUNTING_GEN    seqcount_t vtime_seqcount;    unsigned long long vtime_snap;    enum {        /* Task is sleeping or running in a CPU with VTIME inactive */        VTIME_INACTIVE = 0,        /* Task runs in userspace in a CPU with VTIME active */        VTIME_USER,        /* Task runs in kernelspace in a CPU with VTIME active */        VTIME_SYS,    } vtime_snap_whence;#endif#ifdef CONFIG_NO_HZ_FULL    atomic_t tick_dep_mask;#endif    unsigned long nvcsw, nivcsw; /* context switch counts */    u64 start_time;     /* monotonic time in nsec */    u64 real_start_time;    /* boot based time in nsec *//* mm fault and swap info: this can arguably be seen as either mm-specific or thread-specific */    unsigned long min_flt, maj_flt;#ifdef CONFIG_POSIX_TIMERS    struct task_cputime cputime_expires;    struct list_head cpu_timers[3];#endif/* process credentials */    const struct cred __rcu *ptracer_cred; /* Tracer's credentials at attach */    const struct cred __rcu *real_cred; /* objective and real subjective task                     * credentials (COW) */    const struct cred __rcu *cred;  /* effective (overridable) subjective task                     * credentials (COW) */    char comm[TASK_COMM_LEN]; /* executable name excluding path                     - access with [gs]et_task_comm (which lock                       it with task_lock())                     - initialized normally by setup_new_exec *//* file system info */    struct nameidata *nameidata;#ifdef CONFIG_SYSVIPC/* ipc stuff */    struct sysv_sem sysvsem;    struct sysv_shm sysvshm;#endif#ifdef CONFIG_DETECT_HUNG_TASK/* hung task detection */    unsigned long last_switch_count;#endif/* filesystem information */    struct fs_struct *fs;/* open file information */    struct files_struct *files;/* namespaces */    struct nsproxy *nsproxy;/* signal handlers */    struct signal_struct *signal;    struct sighand_struct *sighand;    sigset_t blocked, real_blocked;    sigset_t saved_sigmask; /* restored if set_restore_sigmask() was used */    struct sigpending pending;    unsigned long sas_ss_sp;    size_t sas_ss_size;    unsigned sas_ss_flags;    struct callback_head *task_works;    struct audit_context *audit_context;#ifdef CONFIG_AUDITSYSCALL    kuid_t loginuid;    unsigned int sessionid;#endif    struct seccomp seccomp;/* Thread group tracking */    u32 parent_exec_id;    u32 self_exec_id;/* Protection of (de-)allocation: mm, files, fs, tty, keyrings, mems_allowed, * mempolicy */    spinlock_t alloc_lock;    /* Protection of the PI data structures: */    raw_spinlock_t pi_lock;    struct wake_q_node wake_q;#ifdef CONFIG_RT_MUTEXES    /* PI waiters blocked on a rt_mutex held by this task */    struct rb_root pi_waiters;    struct rb_node *pi_waiters_leftmost;    /* Deadlock detection and priority inheritance handling */    struct rt_mutex_waiter *pi_blocked_on;#endif#ifdef CONFIG_DEBUG_MUTEXES    /* mutex deadlock detection */    struct mutex_waiter *blocked_on;#endif#ifdef CONFIG_TRACE_IRQFLAGS    unsigned int irq_events;    unsigned long hardirq_enable_ip;    unsigned long hardirq_disable_ip;    unsigned int hardirq_enable_event;    unsigned int hardirq_disable_event;    int hardirqs_enabled;    int hardirq_context;    unsigned long softirq_disable_ip;    unsigned long softirq_enable_ip;    unsigned int softirq_disable_event;    unsigned int softirq_enable_event;    int softirqs_enabled;    int softirq_context;#endif#ifdef CONFIG_LOCKDEP# define MAX_LOCK_DEPTH 48UL    u64 curr_chain_key;    int lockdep_depth;    unsigned int lockdep_recursion;    struct held_lock held_locks[MAX_LOCK_DEPTH];    gfp_t lockdep_reclaim_gfp;#endif#ifdef CONFIG_UBSAN    unsigned int in_ubsan;#endif/* journalling filesystem info */    void *journal_info;/* stacked block device info */    struct bio_list *bio_list;#ifdef CONFIG_BLOCK/* stack plugging */    struct blk_plug *plug;#endif/* VM state */    struct reclaim_state *reclaim_state;    struct backing_dev_info *backing_dev_info;    struct io_context *io_context;    unsigned long ptrace_message;    siginfo_t *last_siginfo; /* For ptrace use.  */    struct task_io_accounting ioac;#if defined(CONFIG_TASK_XACCT)    u64 acct_rss_mem1;  /* accumulated rss usage */    u64 acct_vm_mem1;   /* accumulated virtual memory usage */    u64 acct_timexpd;   /* stime + utime since last update */#endif#ifdef CONFIG_CPUSETS    nodemask_t mems_allowed;    /* Protected by alloc_lock */    seqcount_t mems_allowed_seq;    /* Seqence no to catch updates */    int cpuset_mem_spread_rotor;    int cpuset_slab_spread_rotor;#endif#ifdef CONFIG_CGROUPS    /* Control Group info protected by css_set_lock */    struct css_set __rcu *cgroups;    /* cg_list protected by css_set_lock and tsk->alloc_lock */    struct list_head cg_list;#endif#ifdef CONFIG_INTEL_RDT_A    int closid;#endif#ifdef CONFIG_FUTEX    struct robust_list_head __user *robust_list;#ifdef CONFIG_COMPAT    struct compat_robust_list_head __user *compat_robust_list;#endif    struct list_head pi_state_list;    struct futex_pi_state *pi_state_cache;#endif#ifdef CONFIG_PERF_EVENTS    struct perf_event_context *perf_event_ctxp[perf_nr_task_contexts];    struct mutex perf_event_mutex;    struct list_head perf_event_list;#endif#ifdef CONFIG_DEBUG_PREEMPT    unsigned long preempt_disable_ip;#endif#ifdef CONFIG_NUMA    struct mempolicy *mempolicy;    /* Protected by alloc_lock */    short il_next;    short pref_node_fork;#endif#ifdef CONFIG_NUMA_BALANCING    int numa_scan_seq;    unsigned int numa_scan_period;    unsigned int numa_scan_period_max;    int numa_preferred_nid;    unsigned long numa_migrate_retry;    u64 node_stamp;         /* migration stamp  */    u64 last_task_numa_placement;    u64 last_sum_exec_runtime;    struct callback_head numa_work;    struct list_head numa_entry;    struct numa_group *numa_group;    /*     * numa_faults is an array split into four regions:     * faults_memory, faults_cpu, faults_memory_buffer, faults_cpu_buffer     * in this precise order.     *     * faults_memory: Exponential decaying average of faults on a per-node     * basis. Scheduling placement decisions are made based on these     * counts. The values remain static for the duration of a PTE scan.     * faults_cpu: Track the nodes the process was running on when a NUMA     * hinting fault was incurred.     * faults_memory_buffer and faults_cpu_buffer: Record faults per node     * during the current scan window. When the scan completes, the counts     * in faults_memory and faults_cpu decay and these values are copied.     */    unsigned long *numa_faults;    unsigned long total_numa_faults;    /*     * numa_faults_locality tracks if faults recorded during the last     * scan window were remote/local or failed to migrate. The task scan     * period is adapted based on the locality of the faults with different     * weights depending on whether they were shared or private faults     */    unsigned long numa_faults_locality[3];    unsigned long numa_pages_migrated;#endif /* CONFIG_NUMA_BALANCING */#ifdef CONFIG_ARCH_WANT_BATCHED_UNMAP_TLB_FLUSH    struct tlbflush_unmap_batch tlb_ubc;#endif    struct rcu_head rcu;    /*     * cache last used pipe for splice     */    struct pipe_inode_info *splice_pipe;    struct page_frag task_frag;#ifdef  CONFIG_TASK_DELAY_ACCT    struct task_delay_info *delays;#endif#ifdef CONFIG_FAULT_INJECTION    int make_it_fail;#endif    /*     * when (nr_dirtied >= nr_dirtied_pause), it's time to call     * balance_dirty_pages() for some dirty throttling pause     */    int nr_dirtied;    int nr_dirtied_pause;    unsigned long dirty_paused_when; /* start of a write-and-pause period */#ifdef CONFIG_LATENCYTOP    int latency_record_count;    struct latency_record latency_record[LT_SAVECOUNT];#endif    /*     * time slack values; these are used to round up poll() and     * select() etc timeout values. These are in nanoseconds.     */    u64 timer_slack_ns;    u64 default_timer_slack_ns;#ifdef CONFIG_KASAN    unsigned int kasan_depth;#endif#ifdef CONFIG_FUNCTION_GRAPH_TRACER    /* Index of current stored address in ret_stack */    int curr_ret_stack;    /* Stack of return addresses for return function tracing */    struct ftrace_ret_stack *ret_stack;    /* time stamp for last schedule */    unsigned long long ftrace_timestamp;    /*     * Number of functions that haven't been traced     * because of depth overrun.     */    atomic_t trace_overrun;    /* Pause for the tracing */    atomic_t tracing_graph_pause;#endif#ifdef CONFIG_TRACING    /* state flags for use by tracers */    unsigned long trace;    /* bitmask and counter of trace recursion */    unsigned long trace_recursion;#endif /* CONFIG_TRACING */#ifdef CONFIG_KCOV    /* Coverage collection mode enabled for this task (0 if disabled). */    enum kcov_mode kcov_mode;    /* Size of the kcov_area. */    unsigned    kcov_size;    /* Buffer for coverage collection. */    void        *kcov_area;    /* kcov desciptor wired with this task or NULL. */    struct kcov *kcov;#endif#ifdef CONFIG_MEMCG    struct mem_cgroup *memcg_in_oom;    gfp_t memcg_oom_gfp_mask;    int memcg_oom_order;    /* number of pages to reclaim on returning to userland */    unsigned int memcg_nr_pages_over_high;#endif#ifdef CONFIG_UPROBES    struct uprobe_task *utask;#endif#if defined(CONFIG_BCACHE) || defined(CONFIG_BCACHE_MODULE)    unsigned int    sequential_io;    unsigned int    sequential_io_avg;#endif#ifdef CONFIG_DEBUG_ATOMIC_SLEEP    unsigned long   task_state_change;#endif    int pagefault_disabled;#ifdef CONFIG_MMU    struct task_struct *oom_reaper_list;#endif#ifdef CONFIG_VMAP_STACK    struct vm_struct *stack_vm_area;#endif#ifdef CONFIG_THREAD_INFO_IN_TASK    /* A live task holds one reference. */    atomic_t stack_refcount;#endif/* CPU-specific state of this task */    struct thread_struct thread;/* * WARNING: on x86, 'thread_struct' contains a variable-sized * structure.  It *MUST* be at the end of 'task_struct'. * * Do not put anything below here! */};
0 0
原创粉丝点击