c - 通过 C 程序运行 BASH 命令

标签 c string

我正在尝试通过 C 程序运行 BASH 命令,但我在使用函数 execv 时遇到了困难。我真的不知道如何编写该函数的第一个参数。我尝试使用 strcat 函数将字符串“/bin/”附加到 argv 选项卡的第一个元素,这是我在运行程序时编写的命令,但它不起作用。我得到一个“段错误”。我尝试使用 strdup 而不是使用 strcat 函数,但我不知道如何正确使用它。

如有任何帮助,我们将不胜感激。我的程序如下。

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>

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

char *tab[] = {argv[1],NULL};

if(execve(strcat("/bin/",argv[1]), tab, envp)==-1)
{
    perror("execve");
    return EXIT_FAILURE;
}

return EXIT_SUCCESS;
}

最佳答案

关于:

if(execve(strcat("/bin/",argv[1]), tab, envp)==-1)  

这行不通,

  1. 文字“/bin/”在只读内存中,因此无法更改(需要一个足够大的字符缓冲区来容纳完整的字符串,类似于 `char string[100] = "/bin/"; <

建议:

#include <stdio.h>      // perror()
#include <stdlib.h>     // exit(), EXIT_FAILURE
#include <sys/types.h>
#include <sys/wait.h>   // waitpid()

#include <unistd.h>     // fork(), execvp()
#include <string.h>     // strlen(), strcpy(), strcat()

int main( int argc, char *argv[], char *env[] )
{
    (void)argc;

    char *tab[] = { argv[1], NULL };

    char string[strlen(argv[1]) + strlen( "/bin/" ) +1 ];
    strcpy( string, "/bin/" );
    strcat( string, argv[1] );

    int status;

    pid_t pid = fork();
    switch( pid )
    {
        case -1:   // fork failed
            perror( "fork failed" );
            exit( EXIT_FAILURE );
            break;

        case 0:    // child process
            execve( string, tab, env );   // does not return unless an error
            perror("execve failed");
            exit( EXIT_FAILURE );
            break;

        default:
            waitpid( pid, &status, 0 );
            break;
    }

}

警告:提议的代码只是隐藏参数:argc 而不是正确检查它以确保命令行确实包含参数。

警告:main:env[] 的参数不可移植,不应使用。建议使用:

extern char *environ[];

关于c - 通过 C 程序运行 BASH 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46631592/

相关文章:

c - 获取整数位数

javascript - 如何在单独的行中打印每个单词。除第一个单词外,每个单词都大写

sql - SQL 中的 STR 函数

c# - 如何将带小数点的字符串解析为 double ?

C 编程 : += vs =+

c - 结构 : what should go a header and what should go in the source?

c - strcat() 覆盖我的字符串的问题

c - 如何将一个 .c 文件中定义的结构填充到另一个 .c 中定义的函数中,而不将指针作为参数传递?

Java : String Manipulation using Split function

C++消息查找表(iostream)