小声问一句,吧里有对linux进程熟悉的么?
李毅吧
全部回复
仅看楼主
level 6
z小Cc 楼主
在linux吧里提问没人理我,还是求助于强大的14们吧。问题如下:通过对Linux的fork.c、exit.c代码的分析画出相关的框图 。
2008年06月03日 12点06分 1
level 6
友情帮顶
2008年06月03日 12点06分 2
level 8
C语言13分。重修2次依然没过的不知道
2008年06月03日 12点06分 3
level 1
不懂唉,帮大CC顶
2008年06月03日 12点06分 4
level 0
楼主学计算机专业的?数据结构学过不?
2008年06月03日 12点06分 5
level 6
z小Cc 楼主
3L对了,一直忘跟你说。以后学习方面有需要我的地方就说,虽然我也学得不是很好~感谢2L的支持这个流程图我实在是画不出来了。头疼~
2008年06月03日 12点06分 6
level 1
不会,装过几次ubuntu,除此对Linux毅无所知
2008年06月03日 12点06分 7
level 6
z小Cc 楼主
我可以发代码。数据结构学过。 我现在没心情研究,眼都花了。
2008年06月03日 12点06分 8
level 8
........哎。习惯大家的主动要求帮助了,谢谢了,辅导员安排过好几个帮助我的了
2008年06月03日 12点06分 9
level 1
贴出来吧,没准吧里有人会呢
2008年06月03日 12点06分 10
level 6
z小Cc 楼主
谢谢小cc帮顶
2008年06月03日 12点06分 11
level 0
数据结构老子考了6回 到现在还没过 现在快毕业了 都不晓得能不能拿到毕业证
2008年06月03日 12点06分 12
level 5
好的,那我帖出来了。
2008年06月03日 12点06分 13
level 6
z小Cc 楼主
太长了。哎~其实大学里考试只要跟教师关系好了就没问题的。
2008年06月03日 12点06分 14
level 6
z小Cc 楼主
怎么还没审核完呢?
2008年06月03日 12点06分 15
level 6
z小Cc 楼主
/* * linux/kernel/exit.c * * (C) 1991 Linus Torvalds */#include
// 错误号头文件。包含系统中各种出错号。(Linus 从minix 中引进的)#include
// 信号头文件。定义信号符号常量,信号结构以及信号操作函数原型。#include
// 等待调用头文件。定义系统调用wait()和waitpid()及相关常数符号。#include
// 调度程序头文件,定义了任务结构task_struct、初始任务0 的数据,// 还有一些有关描述符参数设置和获取的嵌入式汇编函数宏语句。#include
// 内核头文件。含有一些内核常用函数的原形定义。#include
// tty 头文件,定义了有关tty_io,串行通信方面的参数、常数。#include
// 段操作头文件。定义了有关段寄存器操作的嵌入式汇编函数。int sys_pause(void); //把进程置为睡眼状态的系统调用。(kernel/sched.c,144 行)int sys_close(int fd); //关闭指定文件的系统调用。(fs/open.c,192 行)////释放指定进程战胜的任务槽及其任务数据结构所战胜的内存。//参数P是任务数据结构的指针。该函数在后面的sys-kill()和sys-waitpid()中被调用。//扫描任务指针数组表task〔〕以寻找指定的任务。如果找到,则首先清空任务槽,然后释放//该任务数据结构所占用的内存页面,最后执行函数并在返回时立即退出。如果在任务数组//表中没有找到指定任务对应的项,则内核panic.
2008年06月03日 12点06分 16
level 6
z小Cc 楼主
void release(struct task_struct * p){int i;if (!p) //如果进程数据结构指针是NULL,则什么也不做,退出。return;for (i=1 ; i
32)return -EINVAL;// 如果强制发送标志置位,或者当前进程的有效用户标识符(euid)就是指定进程的euid(也即是自己),// 或者当前进程是超级用户,则在进程位图中添加该信号,否则出错退出。// 其中suser()定义为(current->euid==0),用于判断是否是超级用户。
2008年06月03日 12点06分 17
level 6
z小Cc 楼主
if (priv || (current->euid==p->euid) || suser())p->signal |= (1<<(sig-1));elsereturn -EPERM;return 0;}//// 终止会话(session)。// 进程会话的概念请参见第4 章中有关进程组和会话的说明。static void kill_session(void){struct task_struct **p = NR_TASKS + task; // 指针*p 首先指向任务数组最末端。// 扫描任务指针数组,对于所有的任务(除任务0 以外),如果其会话号session 等于当前进程的// 会话号就向它发送挂断进程信号SIGHUP。while (--p > &FIRST_TASK) {if (*p && (*p)->session == current->session)(*p)->signal |= 1<<(SIGHUP-1); // 发送挂断进程信号。}}/* * XXX need to check permissions needed to send signals to process * groups, etc. etc. kill() permissions semantics are tricky! */* 为了向进程组等发送信号,XXX 需要检查许可。kill()的许可机制非常巧妙!* ///// 系统调用kill()可用于向任何进程或进程组发送任何信号,而并非只是杀死进程☺。// 参数pid 是进程号;sig 是需要发送的信号。// 如果pid 值>0,则信号被发送给进程号是pid 的进程。// 如果pid=0,那么信号就会被发送给当前进程的进程组中的所有进程。// 如果pid=-1,则信号sig 就会发送给除第一个进程外的所有进程。// 如果pid < -1,则信号sig 将发送给进程组-pid 的所有进程。// 如果信号sig 为0,则不发送信号,但仍会进行错误检查。如果成功则返回0。// 该函数扫描任务数组表,并根据pid 的值对满足条件的进程发送指定的信号sig。若pid 等于0,
2008年06月03日 12点06分 18
level 6
z小Cc 楼主
// 表明当前进程是进程组组长,因此需要向所有组内的进程强制发送信号sig。int sys_kill(int pid,int sig){struct task_struct **p = NR_TASKS + task;int err, retval = 0;if (!pid) while (--p > &FIRST_TASK) {if (*p && (*p)->pgrp == current->pid) if (err=send_sig(sig,*p,1)) // 强制发送信号。retval = err;} else if (pid>0) while (--p > &FIRST_TASK) {if (*p && (*p)->pid == pid) if (err=send_sig(sig,*p,0))retval = err;} else if (pid == -1) while (--p > &FIRST_TASK)if (err = send_sig(sig,*p,0))retval = err;else while (--p > &FIRST_TASK)if (*p && (*p)->pgrp == -pid)if (err = send_sig(sig,*p,0))retval = err;return retval;}//// 通知父进程 -- 向进程pid 发送信号SIGCHLD:默认情况下子进程将停止或终止。// 如果没有找到父进程,则自己释放。但根据POSIX.1 要求,若父进程已先行终止,则子进程应该// 被初始进程1 收容。static void tell_father(int pid){int i;if (pid)// 扫描进程数组表寻找指定进程pid,并向其发送子进程将停止或终止信号SIGCHLD。for (i=0;i
pid != pid)continue;task[i]->signal |= (1<<(SIGCHLD-1));return;}/* if we don't find any fathers, we just release ourselves *//* This is not really OK. Must change it to make father 1 *//* 如果没有找到父进程,则进程就自己释放。这样做并不好,必须改成由进程1 充当其父进程。*/
2008年06月03日 12点06分 19
level 6
头大了
2008年06月03日 12点06分 20
1 2 3 4 5 尾页