用C语言结构状态描述进程控制块的信息

用C语言结构状态描述进程控制块的信息,第1张

以下来自linux内核2.6.35.7版本的代码,在头文件linux/sched.h中渣渗定义

struct task_struct {

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

int lock_depth /* BKL lock depth */

#ifdef CONFIG_SMP

#ifdef __ARCH_WANT_UNLOCKED_CTXSW

int oncpu

#endif

#endif

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_PREEMPT_NOTIFIERS

/* list of struct preempt_notifier: */

struct hlist_head preempt_notifiers

#endif

/*

* fpu_counter contains the number of consecutive context switches

* that the FPU is used. If this is over a threshold, the lazy fpu

* saving becomes unlazy to save the trap. This is an unsigned char

* so that after 256 times the counter wraps and the behavior turns

* lazy againthis to deal with bursty apps that only use FPU for

* a short time

*/

unsigned char fpu_counter

#ifdef CONFIG_BLK_DEV_IO_TRACE

unsigned int btrace_seq

#endif

unsigned int policy

cpumask_t cpus_allowed

#ifdef CONFIG_TREE_PREEMPT_RCU

int rcu_read_lock_nesting

char rcu_read_unlock_special

struct rcu_node *rcu_blocked_node

struct list_head rcu_node_entry

#endif /* #ifdef CONFIG_TREE_PREEMPT_RCU */配御

#if defined(CONFIG_SCHEDSTATS) || defined(CONFIG_TASK_DELAY_ACCT)

struct sched_info sched_info

#endif

struct list_head tasks

struct plist_node pushable_tasks

struct mm_struct *mm, *active_mm

#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 int personality

unsigned did_exec:1

unsigned in_execve:1 /* Tell the LSMs that the process is doing an

* execve */

unsigned in_iowait:1

/* Revert to default priority/policy when forking */

unsigned sched_reset_on_fork:1

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 *real_parent/* real parent process */

struct task_struct *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 completion *vfork_done /* for vfork() */

int __user *set_child_tid /* CLONE_CHILD_SETTID */

int __user *clear_child_tid /* CLONE_CHILD_CLEARTID */

cputime_t utime, stime, utimescaled, stimescaled

cputime_t gtime

#ifndef CONFIG_VIRT_CPU_ACCOUNTING

cputime_t prev_utime, prev_stime

#endif

unsigned long nvcsw, nivcsw/* context switch counts */

struct timespec start_time /* monotonic time */

struct timespec real_start_time /* boot based time */

/* mm fault and swap info: this can arguably be seen as either mm-specific or thread-specific */

unsigned long min_flt, maj_flt

struct task_cputime cputime_expires

struct list_head cpu_timers[3]

/* process credentials */

const struct cred *real_cred /* objective and real subjective task

* credentials (COW) */

const struct cred *cred /* effective (overridable) subjective task

* credentials (COW) */

struct mutex cred_guard_mutex /* guard against foreign influences on

* credential calculations

* (notably. ptrace) */

struct cred *replacement_session_keyring/* for KEYCTL_SESSION_TO_PARENT */

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 */

int link_count, total_link_count

#ifdef CONFIG_SYSVIPC

/* ipc stuff */

struct sysv_sem sysvsem

#endif

#ifdef CONFIG_DETECT_HUNG_TASK

/* hung task detection */

unsigned long last_switch_count

#endif

/* CPU-specific state of this task */

struct thread_struct thread

/* 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

int (*notifier)(void *priv)

void *notifier_data

sigset_t *notifier_mask

struct audit_context *audit_context

#ifdef CONFIG_AUDITSYSCALL

uid_t loginuid

unsigned int sessionid

#endif

seccomp_t 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

#ifdef CONFIG_GENERIC_HARDIRQS

/* IRQ handler threads */

struct irqaction *irqaction

#endif

/* Protection of the PI data structures: */

raw_spinlock_t pi_lock

#ifdef CONFIG_RT_MUTEXES

/* PI waiters blocked on a rt_mutex held by this task */

struct plist_head pi_waiters

/* 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

/* journalling filesystem info */

void *journal_info

/* stacked block device info */

struct bio_list *bio_list

/* 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 */

cputime_t acct_timexpd /* stime + utime since last update */

#endif

#ifdef CONFIG_CPUSETS

nodemask_t mems_allowed /* Protected by alloc_lock */

int mems_allowed_change_disable

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 *cgroups

/* cg_list protected by css_set_lock and tsk->alloc_lock */

struct list_head cg_list

#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

struct mutex perf_event_mutex

struct list_head perf_event_list

#endif

#ifdef CONFIG_NUMA

struct mempolicy *mempolicy /* Protected by alloc_lock */

short il_next

#endif

atomic_t fs_excl /* holding fs exclusive resources */

struct rcu_head rcu

/*

* cache last used pipe for splice

*/

struct pipe_inode_info *splice_pipe

#ifdef CONFIG_TASK_DELAY_ACCT

struct task_delay_info *delays

#endif

#ifdef CONFIG_FAULT_INJECTION

int make_it_fail

#endif

struct prop_local_single dirties

#ifdef CONFIG_LATENCYTOP

int latency_record_count

struct latency_record latency_record[LT_SAVECOUNT]

#endif

/*

* time slack valuesthese are used to round up poll() and

* select() etc timeout values. These are in nanoseconds.

*/

unsigned long timer_slack_ns

unsigned long default_timer_slack_ns

struct list_head *scm_work_list

#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 of trace recursion */

unsigned long trace_recursion

#endif /* CONFIG_TRACING */

#ifdef CONFIG_CGROUP_MEM_RES_CTLR /* memcg uses this to do batch job */

struct memcg_batch_info {

int do_batch /* incremented when batch uncharge started */

struct mem_cgroup *memcg/* target memcg of uncharge */

unsigned long bytes /* uncharged usage */

unsigned long memsw_bytes/* uncharged mem+swap usage */

} memcg_batch

#endif

}

#include <iostream>颤做

#include <windows.h>

using namespace std;

/************************************************/

/*参数说明:

char *pszDestPath为需要遍历的目标路径

/************************************************/

EnmuDirectory(char *pszDestPath, int&sum)

{

//此结构说明参MSDN

WIN32_FIND_DATA FindFileData

//查找文件的句柄

HANDLE hListFile

//绝对路径,例:c:\windows\system32\cmd.exe

char szFullPath[MAX_PATH]

//相对路径

char szFilePath[MAX_PATH]

//构造相对路径

wsprintf(szFilePath, "%s\\*", pszDestPath)

//查找第一个文件,获得查找句柄,如果FindFirstFile返回INVALID_HANDLE_VALUE则返回

if((hListFile = FindFirstFile(szFilePath, &FindFileData)) == INVALID_HANDLE_VALUE)

{

//查找文件错误

return 1

}

else

{

do

{

if( lstrcmp(FindFileData.cFileName, TEXT(".")) == 0 ||

lstrcmp(FindFileData.cFileName, TEXT("..")) == 0 )

{

continue

}

//构造全路径

wsprintf(szFullPath, "%s\\%s", pszDestPath, FindFileData.cFileName)

//读键洞亮取文件属性,如果不是文件夹

if(!(FindFileData.dwFileAttributes &FILE_ATTRIBUTE_DIRECTORY))

{

char *pszFileType = NULL

pszFileType = &(FindFileData.cFileName[strlen(FindFileData.cFileName) - 3])

if(!stricmp(pszFileType, "txt"))

{

cout<<FindFileData.cFileName<<endl

++sum

}

}

//如果是文件夹,则递归调用EnmuDirectory函数

if(FindFileData.dwFileAttributes &FILE_ATTRIBUTE_DIRECTORY)

{

EnmuDirectory(szFullPath, sum)

}

//循环,查找下一个文件

}while(FindNextFile(hListFile, &FindFileData))

}

//关闭句柄

FindClose(hListFile)

//清空稿宽结构。可有可无的一句代码。函数退出会自动清空。

ZeroMemory(&FindFileData, sizeof(FindFileData))

return 0

}

int main()

{

int sum = 0

EnmuDirectory("D:", sum)

int main()

{

Link head//链表(不带头节乎春点)

int n

printf("输入链表的长度n: ")

scanf("%d",&n)

printf("连续输入%d个数据(以空格隔开): ",n)

head=CreateLink(n)

printf("\n原本链表的节点是: ")

DispLink(head)

LinkSort(head)

printf("\n从大到小排序之后: ")

DispLink(head)

printf("\n")

return 0

}

链表的具体存储表示为:

① 用一组任意的存储单元来存放线性表的结点(这组存储单元既可以是连续的,也可以是不连续的)

② 链表中结点的逻辑次序和物理次序不一定相同。为了能正确表示结点间的逻辑关系,在存储每个结点值的同时,还必须存储指示其后继结点毕手的地址(或位置)信息(称为指针(pointer)或链(link))

链式存储是最常用的存储方式岁数耐之一,它不仅可用来表示线性表,而且可用来表示各种非线性的数据结构。

以上内容参考:百度百科-单链表


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/8164059.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-14
下一篇 2023-04-14

发表评论

登录后才能评论

评论列表(0条)

保存