您的位置 首页 厂商

exec履行一般文件和解说器文件的差异

1. 从一个问题开始首先要从项目中遇到的一个问题说起。编写一个python文件test.py,文件test.py内容如下:#! /usr/bin/python….如果在命令行方式执行test.py

1. 从一个问题开端

首要要从项目中遇到的一个问题说起。编写一个python文件test.py,文件test.py内容如下:

#! /usr/bin/python

….

假如在指令行方法履行test.py的方法是:

test.py -in inputfile -out outputfile;或python test.py -in inputfile -out outputfile;

可是因为需求,用exec函数(这儿运用execl)去调用这个python文件。在项目中是这样写的:

execl(”test.py”,”-in”,”inputfile”,”-out”,”outputfile”,(char*)0);

但履行成果并不是料想的test.py履行,而是发动了python交互程序,不知道是什么原因。因为一向认为假如写一个C程序,比方main。那么在指令行输入:main arg1 arg2履行的作用和execl(”main”,”arg1”,”arg2”,(char*)0)的作用应该是相同的。

当然一起随同我有另一个问题:

execl(“usr/bin/python”,”test.py”,(char*)0);和输入指令”/usr/bin/python test.py”有什么差异?

为了答复些问题,自己经过再重复看apue和做试验测验,总算一点一点理解了,下面就来一点一点的剖析。

2. 指令行履行程序和exec履行程序的差异

首要咱们来剖析一下在指令行履行一个程序和经过exec函数履行程序有什么差异,或者说需求留意的当地(一下一切编写的文件都在/mnt/hgfs/VWShared/目录下)。

编写程序foo.c如下,并编译为可履行文件foo。它打印参数列表(argv)的一切参数.

l foo.c

#include

int

main(int argc,char* argv[])

{

int i;

for(i=0;i

printf(argv[%d]: %s\n,i,argv[i]);

exit(0);

}

再编写main.c如下,将其编译为可履行文件main,它运用execl调用foo。

l main.c

#include

#include

int main(int argc,char* argv[])

{

int n=0;

if( (n=execl(/mnt/hgfs/VWShared/foo,(char*)0))==-1 )

{

perror(execl error);

exit(0);

}

exit(1);

}

直接在指令行下运转foo,成果如图1:

图1

运转main(经过execl运转foo)成果如图2:

图2

能够看出直接在指令行运转foo,则”./foo”被作为argv[0],可是经过exec运转foo发现并没有参数传入foo(程序没有任何输出),也便是说argc值为0。这是什么原因呢?咱们知道argv寄存的是传递给main函数的指令行参数,当在指令行键入”./foo”时,仅有的指令行参数”./foo”就被传入给main的argv了。所以直接在指令行运转foo就打印出仅有的参数”./foo”。

那么execl的状况呢?首要看一下execl的原型:

int execl(const char* pathname,const char* arg0,…/*(char*)0*/);

留意到了吧,第一个参数是要履行的程序名,第二个参数才是要传入待履行程序的第一个参数,而上述main.c中没有第二个参数(这儿说的是execl的第二个参数),也便是没有给foo传递任何参数,foo的参数表argv当然便是空了,或者说argc为0。

经过这个比如咱们要有以下知道:

argv[0]不一定便是所履行程序的称号,切当的说它仅仅指令行的第一个参数,仅仅一般发动程序是在指令行键入程序称号发动的,所以程序的称号才成为argv[0]。可是也有状况argv[0]不是程序称号的,如:

(1) 经过exec履行时,argv[0]是什么要视exec的参数来定。

例如:咱们将main中的execl句子改为:execl(/mnt/hgfs/VWShared/foo,xxxxx,(char*)0);

再运转main,作用如图3:

图3

能够看到argv[0]变为了咱们传入的参数”xxxxx”。

(2) 经过程序别号发动时,argv[0]便是程序的别号。如咱们给foo创立一个软衔接sfoo,然后履行sfoo作用如图4:

图4

能够看出输出的argv[0]是./sfoo 而不是./foo,再次证明argv[0]是什么和程序称号无关,仅仅和传入的指令行第一个参数有关。

弥补:在创立上述软衔接过程中遇到了一点小问题,无妨也在这儿写下来:

【问题】

在编译VMware下的Linux体系对从Windows中同享过来的文件,进行编译的时分,遇到:ln: creating symbolic link XXXXXX : Operation not supported

【解决办法】

呈现这类问题,主要是因为在编译的时分,要用ln去树立一些软链接,而这些文件是从Windows中,经过VMWare虚拟机同享进Linux的,而尽管此种操作在Linux体系中很常见,但Windows不支持,所以,编译会报错。比较便利的解决办法是先将文件考到linux的其他目录,再在其他非同享目录中创立软衔接。别的还有个解决办法便是,在VMWare下的Linux中,树立Samba服务,然后新创立新samba用户和文件夹,然后在windows中就能够访问到该文件夹了。然后把在Linux中,从同享目录复制到你所要同享的samba目录中,这样,也能够完成咱们所要的文件同享。此刻在去编译这些代码的时分,因为是在Linux体系中的,所以就OK了。

3. 解说器文件和解说器

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/323135.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部