当前位置: 技术问答>linux和unix
请教关于Linux下的进程管理
来源: 互联网 发布时间:2017-02-19
本文导语: 本帖最后由 qwersss 于 2012-04-17 13:11:31 编辑 最近在L1nux下学习进程管理,遇到了一些问题,想在这里请教一下大家: 1.在/proc//stat里有一个字段是sessi0n id,这个值和/proc//sessi0nid里的值不一样,这是为什么?到底哪一个是正确的...
1.在/proc//stat里有一个字段是sessi0n id,这个值和/proc//sessi0nid里的值不一样,这是为什么?到底哪一个是正确的? 我在man proc里没有找到关于文件sessi0nid的解释;
2.如何能够判断一个进程是32或64 bit的?我查看了一些资料,似乎通过一些配置,32bit的程序在64bit平台上市可以运行起来的;
3.通过lsof -p,怎样可以判断哪些是进程动态加载的库?虽然通过文件名与路径可以判断,但是我觉得这样不是一个很稳妥的方式.我认为所有FD为mem,TYPE为REG的文件,就应该是动态库文件了,请问一下大家怎么觉得呢?
我刚接触Linux不久,可能问题比较幼稚.之前在网上搜索也没有找到期望的答案,很多搜索到的解释都比较笼统,所以在这里提问,希望大家能不吝赐教 ^.^
|
1、
/proc/%d/sessionid 这个确实是sessionid
对应内核函数
static ssize_t proc_sessionid_read(struct file * file, char __user * buf,
size_t count, loff_t *ppos)
{
...
length = scnprintf(tmpbuf, TMPBUFLEN, "%u", audit_get_sessionid(task));
...
}
/proc/%d/stat 里面并没有找到什么代表sessionid的东西,不过有一个sid,你可能把sessionid和sid搞混了
对应内核函数
static int do_task_stat(struct seq_file *m, struct pid_namespace *ns,struct pid *pid, struct task_struct *task, int whole)
{
...
sid = task_session_nr_ns(task, ns);
...
seq_printf(m, "%d (%s) %c %d %d %d %d %d %u %lu
%lu %lu %lu %lu %lu %ld %ld %ld %ld %d 0 %llu %lu %ld %lu %lu %lu %lu %lu
%lu %lu %lu %lu %lu %lu %lu %lu %d %d %u %u %llu %lu %ldn",
pid_nr_ns(pid, ns),
tcomm,
state,
ppid,
pgid,
sid,
tty_nr,
tty_pgrp,
task->flags,
min_flt,
cmin_flt,
maj_flt,
cmaj_flt,
cputime_to_clock_t(utime),
cputime_to_clock_t(stime),
cputime_to_clock_t(cutime),
cputime_to_clock_t(cstime),
priority,
nice,
num_threads,
start_time,
vsize,
mm ? get_mm_rss(mm) : 0,
rsslim,
mm ? mm->start_code : 0,
mm ? mm->end_code : 0,
(permitted && mm) ? mm->start_stack : 0,
esp,
eip,
/* The signal information here is obsolete.
* It must be decimal for Linux 2.0 compatibility.
* Use /proc/#/status for real-time signals.
*/
task->pending.signal.sig[0] & 0x7fffffffUL,
task->blocked.sig[0] & 0x7fffffffUL,
sigign .sig[0] & 0x7fffffffUL,
sigcatch .sig[0] & 0x7fffffffUL,
wchan,
0UL,
0UL,
task->exit_signal,
task_cpu(task),
task->rt_priority,
task->policy,
(unsigned long long)delayacct_blkio_ticks(task),
cputime_to_clock_t(gtime),
cputime_to_clock_t(cgtime));
...
}
所以归根到底你的问题应该是sessionid和sid有什么区别
看内核结构体
struct task_struct {
...
/* namespaces */
struct nsproxy *nsproxy;
...
#ifdef CONFIG_AUDITSYSCALL
uid_t loginuid;
unsigned int sessionid;
#endif
...
}
audit_get_sessionid 直接返回的是task_struct 的sessionid; task_session_nr_ns 返回的是 nsproxy里的pid_ns;
可以看出sessionid 只有在CONFIG_AUDITSYSCALL开启时才会有,sid总是存在,2者并没有什么必然联系。
|
1. 在我的机器上,以当前的终端打开的bash为例:
$ ps -eo sess,pid,fname | grep bash
30789 30789 bash
所以bash的session id和pid都为30789;
2. 查看sessionid
$cat /proc/30789/sessionid
2
这个2不知道是什么意思?查看/proc/30789/stat中的确实是session id,这个sessionid的文件保存的不知道是什么。
$ ps -eo sess,pid,fname | grep bash
30789 30789 bash
所以bash的session id和pid都为30789;
2. 查看sessionid
$cat /proc/30789/sessionid
2
这个2不知道是什么意思?查看/proc/30789/stat中的确实是session id,这个sessionid的文件保存的不知道是什么。