Linux进程控制详解及实例
|
Linux进程控制详解及实例 常用函数:
进程的建立 如果fork()调用成功,就会使内核建立一个新的进程,所建的新进程是调用fork()进程的副本。也就是说,新的进程运行与其创建者一样的程序,其中的变量具有与创建进程变量相同的值。 系统调用fork()没有参数,它返回一个pid_t类型的值pid。pid被用来区分父进程和子进程。在父进程中pid被置为一个非0的正整数;在子进程中,pid被置为0。 进程的运行 exec系列调用: int execl(const char* path,const char *arg,...); int execlp(const char * file,...); int execle(const char *path,...,char * const envp[]); int execv(const char* path,char *const argv[]); int execvp(const char* file,char * const argv[]); 由于参数的个数是任意的,所以必须用一个null指针来标记参数表的结尾。下面给出一个使用execl()和execv()调用来运行ls的例子:
/*execl的例子*/
#include <stdio.h>
#include <unistd.h>
main(){
printf("Excuting lsn");
execl("/bin/ls","ls","-l",NULL);
/*如果execl返回,说明调用失败*/
perror("execl failed to run ls");
exit(1);
}
/*execv的例子*/
#include <stdio.h>
#include <unistd.h>
main(){
char *cmd[]={"ls",NULL};
execv("/bin/ls",cmd);
perror("execv failed");
exit(1);
}
系统调用execlp()和execvp()分别类似于系统调用execl()和execv(),它们的主要区别是:execlp()和execvp()的第一个参数指向的是一个简单的文件名,而不是一个路径名。它们通过检索shell环境变量PATH指出的目录,来得到该文件名的路径前缀部分。 exec和fork()的联用 通过联用可以实现父进程运行一个与其不同的子进程,并且父进程不会被覆盖。下面给出一个 exec和fork()联用的例子:
#include <stdio.h>
#include <unistd.h>
main(){
int pid;
/*fork子进程*/
pid = fork();
switch(pid){
case -1:
perror("fork failed.");
exit(1);
case 0:
execl("/bin/ls",NULL);
perror("execl failed.");
exit(1);
default:
wait(NULL);
printf("ls completed.n");
exit(0);
}
}
在fork()调用之前,只有一个进程A,fork()调用后就有了进程A和B。A是父进程,它正在执行系统调用wait(),使进程A睡眠,直至进程B结束。同时进程B正在用execl装入命令ls。exec调用后,进程B的程序被ls的代码取代,执行ls命令的代码。 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
