摘要: system的原型定义大体如下: #include <stdio.h> #include <stddef.h> #include <signal.h> #include <unistd.h> #include <sys/wait.h> #include <sys/syscall.h> #if ! defined __NR_vfork #define vfork fork #endif int system(char *cmdstr) { int wait_state = -1; int pid = -1; __sighan 阅读全文
posted @ 2011-09-24 16:35 only_eVonne 阅读(2222) 评论(0) 推荐(0) 编辑
摘要: Linux的线程实现是在核外进行的,核内提供的是创建进程的接口do_fork()。内核提供了两个系统调用__clone()和fork(),最终都用不同的参数调用do_fork()核内API。 do_fork() 提供了很多参数,包括CLONE_VM(共享内存空间)、CLONE_FS(共享文件系统信息)、CLONE_FILES(共享文件描述符表)、CLONE_SIGHAND(共享信号句柄表)和CLONE_PID(共享进程ID,仅对核内进程,即0号进程有效)。当使用fork系统调用产生多进程时,内核调用do_fork()不使用任何共享属性,进程拥有独立的运行环境。当使用pthread_create 阅读全文
posted @ 2011-09-24 16:33 only_eVonne 阅读(1946) 评论(0) 推荐(0) 编辑
摘要: 关于linux线程在许多经典的操作系统教科书中,总是把进程定义为程序的执行实例,它并不执行什么,只是维护应用程序所需的各种资源。而线程则是真正的执行实体,为了让进程完成一定的工作,进程必须至少包含一个线程。进程所维护的是程序所包含的资源(静态资源),如:地址空间,打开的文件句柄集,文件系统状态,信号处理handler等。线程所维护的是运行相关的资源(动态资源),如:运行栈,调度相关的控制信息,待处理的信号集等。然而,一直以来,linux内核并没有线程的概念。每一个执行实体都是一个task_struct结构,通常称之为进程。linux进程是一个执行单元,维护着执行相关的动态资源,同时,它又引用着 阅读全文
posted @ 2011-09-24 16:30 only_eVonne 阅读(3211) 评论(0) 推荐(0) 编辑
摘要: 执行文件是如何在shell中被"执行"的。本文中尽可能少用一些源码,免得太过于无聊,主要讲清这个过程,感兴趣的同学可以去查看相应的源码了解更多的信息。1.父进程的行为:复制,等待执行应用程序的方式有很多,从shell中执行是一种常见的情况。交互式shell是一个进程(所有的进程都由pid号为1的init进程fork得到,关于这个话题涉及到Linux启动和初始化,以及idle进程等,有空再说),当在用户在shell中敲入./test执行程序时,shell先fork()出一个子进程(这也是很多文章中说的子shell),并且wait()这个子进程结束,所以当test执行结束后,又 阅读全文
posted @ 2011-09-24 15:34 only_eVonne 阅读(8071) 评论(0) 推荐(1) 编辑