【问题标题】:start terminal (sh) from execv return error : /bin/sh: /bin/sh: cannot execute binary file从 execv 启动终端 (sh) 返回错误:/bin/sh: /bin/sh: 无法执行二进制文件
【发布时间】:2018-09-03 15:21:57
【问题描述】:

我正在尝试从 ac 程序执行在 Linux 中启动新终端的命令 sh,但我收到此错误 /bin/sh: /bin/sh: cannot execute binary file when I am using execv () 和相同用 fork 然后 execv 结果。 但是当我尝试系统命令成功时,我如何使用 execv 执行此命令?

作品:

int main (){
        system("sh");
        return 0;
}

不起作用:

int main (){

        int ret=0;
        char *argv[] = {"/bin/bash", "/bin/sh",NULL};
        ret=execv(argv[0], argv);

        printf("ret: %d \n",ret);
        return 0;
}

此代码返回此错误: /bin/sh: /bin/sh: 无法执行二进制文件

【问题讨论】:

  • 试试:"/bin/bash","-c","/bin/sh"
  • 当我尝试这个时同样的错误:` int main (){ int ret=0; char *argv[] = {"/bin/bash", "/bin/bash","-c","/bin/sh",NULL}; ret=execv(argv[0], argv);返回0; } `
  • 你加倍了/bin/bash
  • 原来失败的原因是因为它相当于运行命令/bin/bash /bin/sh,如果你在命令行运行它,你会得到完全相同的错误。原因是默认情况下,/bin/bash 将其第一个参数解释为要执行的 shell 脚本文件,而 /bin/sh 不是 shell 脚本,它是二进制文件。

标签: c linux bash operating-system embedded-linux


【解决方案1】:
cat aa.c

#include<stdio.h>
#include<unistd.h>
int main (){

        int ret=0;
        char *argv[] = {"/bin/bash", "-c","/bin/sh",'\0'};
        ret=execv(argv[0], argv);

        printf("ret: %d \n",ret);
        return 0;
}

gcc aa.c -o aa

./aa 
sh-4.4$ 

还有……刚刚呢:

#include<stdio.h>
#include<unistd.h>
int main (){

    int ret=0;
    char *argv[] = {"/bin/sh",'\0'};
    ret=execv(argv[0], argv);

    printf("ret: %d \n",ret);
    return 0;
}

【讨论】:

  • 这个答案关于如何处理对`execv()'的调用仍然是错误的
  • 关于:return 0; 一般情况下,返回 0 表示成功。但是代码没有成功。建议:return -1; 正确提示失败
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-30
相关资源
最近更新 更多