Linux内核中的文件描述符:fd的分配--get_unused_fd
作者:网络转载 发布时间:[ 2013/1/16 10:32:29 ] 推荐标签:
这些值时是在哪设定的呢?我们应该知道,linux内核通过fork创建进程,第一个进程是静态定义的。因此,如果进程创建后没有修改这些值,那么这些和第一个进程中的值应该是一样的。下面是第一个进程的task_struct结构,仅列出部分数据。
linux/arch/arm/kernel/init_task.c
struct task_struct init_task = INIT_TASK(init_task);
#define INIT_TASK(tsk)
{
...
.signal = &init_signals,
...
}
init_signals的定义如下:
#define INIT_SIGNALS(sig) {
.count = ATOMIC_INIT(1),
.wait_chldexit = __WAIT_QUEUE_HEAD_INITIALIZER(sig.wait_chldexit),
.shared_pending = {
.list = LIST_HEAD_INIT(sig.shared_pending.list),
.signal = {{0}}},
.posix_timers = LIST_HEAD_INIT(sig.posix_timers),
.cpu_timers = INIT_CPU_TIMERS(sig.cpu_timers),
.rlim = INIT_RLIMITS,
}
includeasm-generic
esource.h
#define INIT_RLIMITS
{
[RLIMIT_CPU] = { RLIM_INFINITY, RLIM_INFINITY },
[RLIMIT_FSIZE] = { RLIM_INFINITY, RLIM_INFINITY },
[RLIMIT_DATA] = { RLIM_INFINITY, RLIM_INFINITY },
[RLIMIT_STACK] = { _STK_LIM, _STK_LIM_MAX },
[RLIMIT_CORE] = { 0, RLIM_INFINITY },
[RLIMIT_RSS] = { RLIM_INFINITY, RLIM_INFINITY },
[RLIMIT_NPROC] = { 0, 0 },
[RLIMIT_NOFILE] = { INR_OPEN, INR_OPEN },
[RLIMIT_MEMLOCK] = { MLOCK_LIMIT, MLOCK_LIMIT },
[RLIMIT_AS] = { RLIM_INFINITY, RLIM_INFINITY },
[RLIMIT_LOCKS] = { RLIM_INFINITY, RLIM_INFINITY },
[RLIMIT_SIGPENDING] = { 0, 0 },
[RLIMIT_MSGQUEUE] = { MQ_BYTES_MAX, MQ_BYTES_MAX },
[RLIMIT_NICE] = { 0, 0 },
[RLIMIT_RTPRIO] = { 0, 0 },
}
#define NR_OPEN (1024*1024) /* Absolute upper limit on fd num */
#define INR_OPEN 1024 /* Initial setting for nfile rlimits */
从上面的代码我们可以看到rlim_cur = 1024,也是说进程多可以打开1024个文件。

sales@spasvo.com