我正在尝试通过 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)
这行不通,
- 文字“/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/