分类: 嵌入式
2011-07-26 15:16:28
进程是一个正在执行的程序的实例,是linux的基本调度单位。有如下元素组成(状态,权限,资源):
程序的当前上下文(context),当前执行的状态
程序的信任状态或者说是访问权限
程序的当前执行目录,要访问的文件和目录
内存和其他分配的系统资源
进程标识号进程号,process ID, PID, getpid()
父进程号,parent process ID, PPID, getppid()
真实用户ID, getuid()
有效用户ID, geteuid()
真实用户组ID, getgid()
有效用户组ID, getegid()
所有的进程追溯其祖先都会落到进程号为1的进程身上,这个进程是init进程。
init进程是内核自举后第一个启动的进程,它引导系统,启动守护进程并且运行必要的程序。
进程的真实ID和有效ID不相同的情况是正在运行中的程序设置了setUID或者setGID后出现的。
setUID和setGID程序的目的就是让用户能够执行具有特殊权限的程序。
除了进程,用户,和组ID外,系统调用和库函数还能够检索进程的其他属性,比如资源利用情况和执行次数( times, getrusage)
创建进程system函数的原型是,
通过把system传递给/bin/sh -c 来执行string说指定的命令,接着整个命令行(/bin/sh -c string)又传递给系统调用 execve。
fork函数的原型是,
子进程是父进程的准确副本(除了PID和PPID,父进程的超时设置(alarm),文件锁,或者未决信号)
如果fork执行成功,则向父进程返回子进程的PID,向子进程返回0。这意味着即使你只调用一次fork,他也会返回两次。
子进程和父进程是异步执行的,无法预计谁先执行,所以两者不能依赖条件。
exec函数族,
exec用被执行的程序完全替换了调用进程的映像。fork创建了一个新进程就产生了一个新的PID,exec启动的新进程,替换了原有的进程,因此,被执行进程的PID不会改变。
所以如果exec执行成功,则以下的代码将不会被执行,如果执行错误,则返回-1.
exec接受3个参数,path, argv, envp.
popen函数,
popen使用管道来工作,其它与system相似。
#include
FILE *popen(const char *command, const char *type);
int pclose(FILE *stream);