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. 解说器文件和解说器