Linux进程控制详解及实例
Linux进程控制详解及实例
常用函数:
- fork()通过复制调用进程来建立新的进程,是最基本的进程建立操作。
- exec 包括一系列的系统调用,其中每个系统调用都完成相同的功能,即通过用一个新的程序覆盖原内存空间,来实现进程的转变。各种exec系统调用之间的区别仅在于它们的参数构造不同。
- wait()它提供了初级的进程同步措施,能使一个进程等待,直到另一个进程结束为止。
- exit() 常用来终止一个进程的运行。
进程的建立
如果fork()调用成功,就会使内核建立一个新的进程,所建的新进程是调用fork()进程的副本。也就是说,新的进程运行与其创建者一样的程序,其中的变量具有与创建进程变量相同的值。
系统调用fork()没有参数,它返回一个pid_t类型的值pid。pid被用来区分父进程和子进程。在父进程中pid被置为一个非0的正整数;在子进程中,pid被置为0。
进程的运行
exec系列调用:
intexecl(constchar*path,constchar*arg,...); intexeclp(constchar*file,constchar*arg,...); intexecle(constchar*path,constchar*arg,...,char*constenvp[]); intexecv(constchar*path,char*constargv[]); intexecvp(constchar*file,char*constargv[]);
由于参数的个数是任意的,所以必须用一个null指针来标记参数表的结尾。下面给出一个使用execl()和execv()调用来运行ls的例子:
/*execl的例子*/ #include#include main(){ printf("Excutingls\n"); execl("/bin/ls","ls","-l",NULL); /*如果execl返回,说明调用失败*/ perror("execlfailedtorunls"); exit(1); } /*execv的例子*/ #include #include main(){ char*cmd[]={"ls","-l",NULL}; execv("/bin/ls",cmd); perror("execvfailed"); exit(1); }
系统调用execlp()和execvp()分别类似于系统调用execl()和execv(),它们的主要区别是:execlp()和execvp()的第一个参数指向的是一个简单的文件名,而不是一个路径名。它们通过检索shell环境变量PATH指出的目录,来得到该文件名的路径前缀部分。
exec和fork()的联用
通过联用可以实现父进程运行一个与其不同的子进程,并且父进程不会被覆盖。下面给出一个exec和fork()联用的例子:
#include#include main(){ intpid; /*fork子进程*/ pid=fork(); switch(pid){ case-1: perror("forkfailed."); exit(1); case0: execl("/bin/ls","ls","-l",NULL); perror("execlfailed."); exit(1); default: wait(NULL); printf("lscompleted.\n"); exit(0); } }
在fork()调用之前,只有一个进程A,fork()调用后就有了进程A和B。A是父进程,它正在执行系统调用wait(),使进程A睡眠,直至进程B结束。同时进程B正在用execl装入命令ls。exec调用后,进程B的程序被ls的代码取代,执行ls命令的代码。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!