linux学习总结进程与线程——exec函数族
2012-06-20 19:59
330 查看
exec提供了一种在进程中启动另外一个程序的执行的方法。它可以根据指定的文件名或目录名找到可执行文件,并用它来取代原调用进程的数据段、代码段和堆栈段。在执行完之后,原调用进程的内容除了进程号外,其他全部都被替换了。
1.可执行文件查找方式
exec族中的函数以p结尾的函数可以只给出文件名,系统会自动从环境变量“$PATH”所包含的路径中进行查找。
即 结尾不是p的,必须要给出文件的路径,并且最后的参数为NULL;
2.参数表传递方式
两种方式:逐个列举或是将所有参数通过指针数组传递。
以函数名的第五位字母来区分,字母为“l”(list)的表示逐个列举的方式;
字母“v”(vertor)的表示将所有参数构造成指针数组传递;
3.环境变量的使用
exec函数族可以默认使用系统的环境变量,也可以传入指定的环境变量。这里,以“e”(Environment)结尾的两个函数可以 envp[]中传递当前进程所使用的环境变量。
exec(1,2,3....,最后个参数)
exec族中,第一个参数为要执行程序的路径。
第二个参数为要执行的程序名称。
第三个参数为给要执行程序传递参数。
最后一个参数为NULL;
例子:
int main ()
{
if(-1 == execle("./exec2","exec2","1.txt",NULL))
{
perror("");
exit(0);
}
}//打开exec2可执行文件,并将"1.txt"传递给exec2中的main函数中的参数中
exit()调用退出处理函数,清理缓存区,调用exit系统调用,进程结束。
_exit()不清理缓存区。
利用exec实现shell的模仿 :
#include <stdio.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#define N 64
int main()
{
pid_t pid;
char buf
;
char *arg
;
int i = 0;
printf(">");
while (fgets(buf, N, stdin) != NULL)
{
buf[strlen(buf)-1] = 0;
if ((pid = fork()) == -1)
{
perror("fork");
exit(-1);
}
if (pid == 0)
{
arg[i++] = strtok(buf, " ");
do
{
arg[i++] = strtok(NULL, " ");
}while(arg[i-1] != NULL);
if (execvp(arg[0], arg) != -1)
{
perror("execvp");
exit(0);
}
}
else
{
wait(NULL);
printf(">");
}
}
exit(0);
}
1.可执行文件查找方式
exec族中的函数以p结尾的函数可以只给出文件名,系统会自动从环境变量“$PATH”所包含的路径中进行查找。
即 结尾不是p的,必须要给出文件的路径,并且最后的参数为NULL;
2.参数表传递方式
两种方式:逐个列举或是将所有参数通过指针数组传递。
以函数名的第五位字母来区分,字母为“l”(list)的表示逐个列举的方式;
字母“v”(vertor)的表示将所有参数构造成指针数组传递;
3.环境变量的使用
exec函数族可以默认使用系统的环境变量,也可以传入指定的环境变量。这里,以“e”(Environment)结尾的两个函数可以 envp[]中传递当前进程所使用的环境变量。
exec(1,2,3....,最后个参数)
exec族中,第一个参数为要执行程序的路径。
第二个参数为要执行的程序名称。
第三个参数为给要执行程序传递参数。
最后一个参数为NULL;
例子:
int main ()
{
if(-1 == execle("./exec2","exec2","1.txt",NULL))
{
perror("");
exit(0);
}
}//打开exec2可执行文件,并将"1.txt"传递给exec2中的main函数中的参数中
exit()调用退出处理函数,清理缓存区,调用exit系统调用,进程结束。
_exit()不清理缓存区。
利用exec实现shell的模仿 :
#include <stdio.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#define N 64
int main()
{
pid_t pid;
char buf
;
char *arg
;
int i = 0;
printf(">");
while (fgets(buf, N, stdin) != NULL)
{
buf[strlen(buf)-1] = 0;
if ((pid = fork()) == -1)
{
perror("fork");
exit(-1);
}
if (pid == 0)
{
arg[i++] = strtok(buf, " ");
do
{
arg[i++] = strtok(NULL, " ");
}while(arg[i-1] != NULL);
if (execvp(arg[0], arg) != -1)
{
perror("execvp");
exit(0);
}
}
else
{
wait(NULL);
printf(">");
}
}
exit(0);
}
相关文章推荐
- Unix/linux进程及线程间同步技术总结【学习总结,请勿吐槽。。。】
- linux学习总结进程与线程
- Unix/linux进程及线程间同步技术总结【学习总结,请勿吐槽。。。】
- linux进程间通讯学习总结
- Linux进程线程学习笔记
- Linux进程通信学习总结
- Linux进程地址空间学习总结
- Linux学习总结05——进程环境
- 20135337朱荟潼 Linux第八周学习总结——进程的切换和系统的一般执行过程
- Linux进程线程学习笔记:进程创建
- Linux进程线程学习笔记:运行新程序
- linux 进程通信-信号学习总结(1)
- Linux的进程/线程间通信方式总结 04
- Linux系统中 任务、进程和线程总结
- Linux的进程/线程间通信方式总结
- Linux的进程/线程间通信方式总结
- Linux学习总结(八)——线程
- Linux的进程/线程通信方式总结
- Linux进程学习(总结学习关于“写时复制”)
- Linux进程线程学习笔记:进程创建