使用文本解释器和execl打印图形

使用文本解释器和execl打印图形,c,unix,C,Unix,我试图使用execl函数打印命令行参数,该函数执行文本解释器,但无法打印第一个参数 这是我的主要节目 #include<unistd.h> #include<stdio.h> #include<fcntl.h> #include<sys/types.h> #include<sys/stat.h> int main(int argc,char *argv[]) { pid_

我试图使用execl函数打印命令行参数,该函数执行文本解释器,但无法打印第一个参数

这是我的主要节目

    #include<unistd.h>
    #include<stdio.h>
    #include<fcntl.h>
    #include<sys/types.h>
    #include<sys/stat.h>

   int main(int argc,char *argv[])
   {
      pid_t pid;
      if((pid=fork())<0)
          printf("error\n");
      else if(pid==0)
      if((execl("textinterpreter","this","is","usp","lab",(char*)0))<0)
            perror("error in execl\n");

      if(waitpid(pid,NULL,0) !=pid)
          printf("error1\n");
      system("ls > list");
      return 0;
    }  
这是我的echoarg1.c文件

     #include<stdio.h>
     #include<unistd.h>
     #include<fcntl.h>
     #include<sys/types.h>
     #include<sys/stat.h>
    main(int argc,char *argv[])
    {
       int i;
       for(i=0;i<argc;i++)
           printf("argv[%d]=%s\n",i,argv[i]);
     }
预期输出在哪里

        argv[0]=/home/chirag/echoarg1
        argv[1]=my1
        argv[2]=textinterpreter
        argv[3]=this
        argv[4]=is
        argv[5]=usp
        argv[6]=lab

请有人指出错误。

从execl手册页:

int execl(常量字符*路径,常量字符arg0,…/,(字符*)0*/)

这些函数的初始参数是 将被执行

execl()、execlp()中的常量char*arg0和后续省略号, 和execle()函数可以看作是arg0、arg1、…、argn。 它们一起描述了一个或多个指向以null结尾的指针的列表 表示已执行程序可用的参数列表的字符串。按照惯例,第一个参数应该指向文件名 与正在执行的文件关联。参数列表必须是 由空指针终止


所以在你的队伍中:

  if((execl("textinterpreter","this","is","usp","lab",(char*)0))<0)
通常,execl的前两个参数可能相同,但它允许您灵活地指定一个用于查找要执行的文件的参数和另一个作为argv[0]传递的参数


作为一个实验,尝试将
execl
更改为直接调用
echoarg1
,如下所示:

if((execl("echoarg1","FAKEPATH","this","is","usp","lab",(char*)0))<0)

在您的示例中,它显示的是“this”而不是“textprogrator”,这是bash解释器处理“textprogrator”脚本的结果。bash解释器的作用如下:

  • 获取hash bang行并运行
    /home/chirag/echoarg1
  • 传递它
    argv[0]=/home/chirag/echoarg1
  • 将它作为附加的arg传递给hashbang行的其余部分(在本例中,只需
    argv[1]=my1
  • 当它附加原始argv列表时,会出现使用可执行路径(“Text解释器”)而不是实际的argv[0](“this”),然后继续使用argv[1](“is”)和其他
    • 丢弃arg0的不是bash解释器(不管它的意思是什么-这里不涉及
      bash
      ),而是内核的函数和语句

               retval = remove_arg_zero(bprm);
      
      上面有一条评论说

      * Splice in (1) the interpreter's name for argv[0] * (2) (optional) argument to interpreter * (3) filename of shell script (replace argv[0]) *拼接(1)argv[0]的解释器名称 *(2)(可选)口译员的参数 *(3)shell脚本的文件名(替换argv[0])
      -在您的情况下,(1)
      /home/chirag/echoarg1
      ,(2)
      my1
      ,(3)
      textTranslator
      (替换
      this
      )。

      我本来希望argv[2]是“this”,而“textTranslator”被跳过。execp的第一个参数是不应在argv中传递的文件路径。剩下的参数,直到NULL指针,都被填充到argv[0]……那么你能告诉我为什么会发生这种情况吗?正如我所说,我对execp的理解是第一个参数不会被传递到新程序的argv中。这与您报告的第二个参数未传入的情况不一致。您使用的Linux/Unix到底是什么风格?#34~precise1 Ubuntu 3.11.0-20-genericIt显示bash解释器使用的是可执行路径,而不是传递的arg0。arg0是要执行的文件可用的参数。它不必指向该文件。您的解决方案将提供我想要的输出,但它没有解释为什么会发生这种情况。它在手册页部分进行了解释。第一个
      execl
      arg是加载和运行的路径,但下一个arg是作为
      argv[0]
      传递的。第一个参数是const char*path。根据手册页,arg0将通过ad argv[0]。是的,如果您进行上面的“实验”,它将直接按照手册页的建议工作。切换似乎是由于bash解释器而发生的。
      execl
      正在执行正确的操作。通常,
      execl
      的前两个参数是相同的。但是正如上面代码片段中的
      execl
      手册页所指出的,这是按惯例的
      execl
      不会强制您为
      path
      arg0
      传递相同的值。在您的示例中,您需要为这两种语言传递“TextTransparer”。这有意义吗?
      if((execl("echoarg1","FAKEPATH","this","is","usp","lab",(char*)0))<0)
      
      argv[0]=FAKEPATH
      argv[1]=this
      argv[2]=is
      argv[3]=usp
      argv[4]=lab
      
               retval = remove_arg_zero(bprm);
      
      * Splice in (1) the interpreter's name for argv[0] * (2) (optional) argument to interpreter * (3) filename of shell script (replace argv[0])