《unix高级环境编程》进程控制——解释器文件

来源:互联网 发布:java短信流程 编辑:程序博客网 时间:2024/05/21 09:01

解释器文件

解释器文件是文本文件,而解析器是可执行的二进制文件。解析器是由解析器文件的第一行指定的,其格式如下:

#!  pathname [optional-argument]//pathename 是解释器的绝对路径;//optional-argument 是传递给解析器的参数

  内核调用 exec 函数的进程实际执行的并不是该解释器文件,而是该解释器文件的第一行中 pathname 所指定的解释器。注意以下区别:

  1. 解释器文件: 以#!开头的文本文件。
  2. 解释器:解释器文件第一行pathname所指定的程序。
  下面用exec 函数调用解释器文件例程:注意:以下文件的工作目录为/tmp

  首先创建解释器echoarg:解释器echoarg由echoarg.c文件编译而成,echoarg.c文件如下所示,实现功能是显示执行程序的参数列表:

#include "apue.h"/* * 函数功能:显示执行程序的参数列表; */int main(int argc, char *argv[]){    int i = 0;    for(i=0;i<argc;i++)        printf("argv[%d]: %s\n",i,argv[i]);    exit(0);}
  接着定义解释器文件testintererp(/tmp是工作路径,echoarg是解释器):这里需要注意,我们创建该文件时,是没有执行权限的,必须更改使其具有可执行权限,最简单的更改就是:

chmod 777 testintererp

#! /tmp/echoarg arg
  最后创建包含exec函数调用的文件test.c,并编译成可执行文件test:

#include "apue.h"#include <sys/wait.h>int main(void){    pid_t pid;    if((pid = fork()) < 0)        err_sys("fork error");    else if(0 == pid)    {        if(execl("/tmp/testintererp","testintererp","myarg1","myarg2",(char *)0) < 0)            err_sys("execl error");    }    if(waitpid(pid,NULL,0) < 0)        err_sys("wait error");    exit(0);}
  执行test文件之后输出结果为:

argv[0]: /tmp/echoargargv[1]: argargv[2]: /tmp/testintererpargv[3]: myarg1argv[4]: myarg2

参考资料:

《UNIX高级环境编程》

0 0