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

解释器文件

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

#!  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/echoarg
argv[1]: arg
argv[2]: /tmp/testintererp
argv[3]: myarg1
argv[4]: myarg2

参考资料:

《UNIX高级环境编程》

你可能感兴趣的:(进程控制,解释器文件,Unix高级环境编程)