首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C execvp不会执行"ls -l“命令,但会执行"ls”

C execvp函数是一个用于执行外部程序的函数。它接受两个参数,第一个参数是一个表示程序路径的字符串,第二个参数是一个数组,其中包含了传递给外部程序的参数。

对于给定的问题,C execvp函数不会执行"ls -l"命令,但会执行"ls"命令。这是因为execvp函数将第一个参数作为程序路径,并且将第二个参数作为程序的参数传递。当"ls -l"作为一个参数传递给execvp函数时,它会认为"ls -l"是一个可执行程序的路径,而不是一个命令。

解决这个问题的一种方法是使用分割字符串的技术将命令和参数拆分成单独的字符串。然后将命令作为第一个参数传递给execvp函数,将参数作为第二个参数传递给execvp函数。这样,execvp函数将能够正确执行"ls -l"命令。

以下是一个示例代码,演示如何使用execvp函数执行"ls -l"命令:

代码语言:txt
复制
#include <unistd.h>
#include <stdio.h>

int main() {
    char* command = "ls";
    char* args[] = {"ls", "-l", NULL};

    if (fork() == 0) {
        execvp(command, args);
        printf("Failed to execute the command.\n");
    }

    return 0;
}

在这个示例中,我们使用了fork函数创建了一个子进程,并在子进程中使用execvp函数执行了"ls -l"命令。如果execvp函数执行成功,子进程将会被替换为"ls -l"命令的执行结果。如果execvp函数执行失败,将会输出一条错误信息。

需要注意的是,以上代码只是一个简单示例,实际应用中可能需要进行错误处理、参数校验等额外操作。

推荐的腾讯云相关产品:无

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

df 和 ls 命令执行夯主

df 和 ls 命令执行夯主 作者:张首富 时间:2020-05-21 w x:y18163201 原因 今天一个朋友问我一个问题,他的描述如下: 1,ls / 执行这个命令的时候卡住,什么反应都没有...strace df -Th 执行卸载 通过上面命令我们能找到是哪个挂载点失效了,我们可以使用下面命令先尝试卸载 umount -lf 有问题的挂载点 然后等个1~2 分钟看看效果,-f 是强制卸载的意思...: strace PROG;PROG 就是要执行的程序(linux 命令)。...strace 命令执行的结果就是按照调用顺序打印出所有的系统调用,包括函数名、参数列表以及返回值。 使用 strace 跟踪一个进程的系统调用的基本流程如下图: ?...创建子进程,在子进程中调用ptrace(PTRACE_TRACEME,0L, 0L, 0L)使其被父进程跟踪,并通过execv函数执行被跟踪的程序。

2K10
  • 【Linux】开始学习进程替换吧!

    —— 尾田荣一郎《海贼王》 开始学习进程替换吧 1 前言 通过学习进程替换,我们可以体会到多语言混搭的快乐,可以从C语言直接蹦到python ,也可以从c++里运行java代码。是不是很厉害!...ls -l -a命令(最后的打印语句也没有进行),可是我执行的是我们的代码,怎么就运行了ls 这个程序呢?...这样应该就可以运行ls命令不会影响原本程序。...*path, const char *arg, …) l 表示列表 list 两个参数分别代表: path (你想执行谁) : 我们执行的程序需要带路径 arg(你想怎么执行) : 咳传多个 , 命令行里怎么运行就怎么写入...举个例子:ls -a -l 所以我们传execl(“/usr/bin/ls” , “ls”,“-a”,“-l”) 。这样就像命令列表 通过这些函数也可以进行执行我们缩写的程序!!!

    9210

    【Linux】进程的程序替换

    \n"); } ---- 运行可执行程序发现,只有begin 以及执行 ls -l -a显示的指令 ---- 再次修改test.c文件内容如下 #include #include...for GNU/Linux 2.6.32, BuildID[sha1]=c8ada1f7095f6b2bb7ddc848e088c2d615c3743e, stripped 使用的 /bin/ls 命令...:找到它,加载执行它 arg:你想怎么执行它(若想执行ls指令,是只执行ls,还是执行ls- lls -l -a指令 在命令行怎么执行这个命令,就把参数一个一个的传递给execl就可以了 最终以...,依旧可以执行ls指令 ---- 4. execvp int execvp(const char *file, char *const argv[]); 带p:代表当执行程序的时候,只需要指定程序名即可...,但是由于没有\n刷新缓冲区,也没有使用相关的刷新库函数,所以命令行会一直在缓冲区中 直到 程序结束才显示,但是这是个死循环,所以什么都不会显示 ---- ---- ---- 执行执行程序后即可显示命令

    2K30

    【Linux】详解进程程序替换

    替换系统命令命令行怎么写,参数就怎么传,参数以NULL结尾。程序替换一旦成功,exec*后序的代码不再执行。因为原程序的数据和代码被替换掉了。exec*程序替换接口只有失败返回值,没有成功返回值。...二、子进程进行程序替换 通过子进程进行程序替换可以让子进程帮我们去做一部分工作,而且子进程发生程序替换不会影响父进程执行,因为替换时代码和数据会发生写时拷贝。...", "ls", "-l", NULL); exit(0); } pid_t rid = waitpid(id, NULL, 0); printf("wait...\n"); return 0; } 2.1、让子进程执行我自己的程序    我自己写了一个C++程序,向替换子进程帮我跑一下: //C++程序 #include using...", "-l", "-a", NULL}; //execvp("ls", argv); execv("/usr/bin/ls", argv); exit(

    8510

    linux系统编程之进程(三):exec系列函数和system函数

    \n");     //  execlp("ls", "ls", "-l", NULL); // 带p会搜索PATH     //  execl("/bin/ls", "ls", "-l", NULL)...; // 带l为可变参数     //  execvp("ls", args); //args数组参数传递给main     //  execv("/bin/ls", args);     int ret...因为如果替换进程映像成功,那么直接到替换进程的main函数开始执行不会返回,故不会输出Exiting main ......三、system函数 功能:system()函数调用“/bin/sh -c command”执行特定的命令,阻塞当前进程直到command命令执行完毕 原型:  int system(const char...ls -l | wc -w */     //  system("ls -l | wc -w");     my_system("ls -l | wc -w");     return 0; } int

    2.2K60

    UNIX高级环境编程 第三次实验 实现带参数的简单Shell

    argv:参数表,比如ls命令中可带的命令行参数-l,-a等。注意,argv的第一个元素必须是要执行的程序(命令)的路径名。 envp:环境变量表,供要执行命令使用。...例子: char *argv[] = {“gcc”, “-g”, “-c”, “hello.c”, NULL};// 编译程序“hello.c”execve(“/bin/ls”, argv1, NULL...); char *argv1[] = {“/bin/ls”, “-l”, “-a”, NULL}; // 执行命令lsl –a”execve(“/usr/ls”, argv1, NULL);...后缀名总结: l:表示list,即每个命令行参数都说明为一个单独的参数 v:表示vector,命令行参数放在数组中 e:调用者提供环境表 p:表示通过环境变量PATH,查找执行文件 f:表示以文件描述符为第一个参数...填入可执行文件参数,子进程开始执行,若出错才会执行下面的execvp error打印错误语句,waitpid等 待特定fork后子进程号结束,若出错则同样做出错打印信息处理 2.6 cd命令 对于一个自制

    93820

    初识Linux · 进程替换

    4 认识所有函数并使用 所有的函数一共有execl execlp execle execv execvp execvpe,不难发现,拿命令行参数进行举例的话,选项一共有l p e v。...由参数,我们可以看到有pathname 和file,我们第一个使用的pathname即路径名,我们要从哪里执行程序,得通过该路径告诉它,file同理,就是文件名,那么对于execl,代表的就是列表,也就是在命令行中我们如何执行...-l",NULL); 因为有l,所以我们要将平常执行ls命令的时候,如何执行的给列出来,这个参数不是固定,所以我们可以执行很多,ls -l -a -n都是可以的,但是注意点是最后的参数一定要是NULL...//execv("/usr/bin/ls", argv); execvp("ls",argv); return 0; } 那么现在关于execlp就应该不用介绍了吧?...l,list出来命令行怎么写的即可,p我们传对应的文件名即可。

    9410

    Linux进程控制——Linux进程程序替换

    ", "ls", "-a", "-l", NULL); 13 printf("pid: %d, exec command end\n", getpid()); 14 } 15...子进程往往会共享父进程的代码和数据,因为有写时拷贝的技术,有新数据写入时,会重新开辟空间所以不会相互影响,保证父子进程的独立性。 但是我们仔细查看代码和执行结果后发现,竟然有一段代码没有执行!...13 printf("pid: %d, exec command end\n", getpid()); 其实是调用exec程序替换,只要exec替换新程序成功了,子进程就回去执行新的程序,因此后面的代码将不会执行...", "ls", "-a", "-l", NULL); //第一个ls代表怎么找到这个程序 //第二个ls其实是命令的一部分,对应怎么执行...具体关系如下图: execv 和 execvp: int main() { char *const argv[] = { "ls", "-a", "-l", NULL }

    9610

    exec族

    这个一直没搞太明白,相识度高是一回事,不会用又是另一回事儿。 所以今天又温故了一遍: 为什么需要exec函数?...fork子进程是为了执行新程序(fork创建了子进程后,子进程和父进程同时被OS调度执行,因此子进程可以单独的执行一个程序,这个程序宏观上将会和父进程程序同时进行) 可以直接在子进程的if中写入新程序打代码...但这样不够灵活,因为我们只能把子进程程序的源代码贴过来执行(必须知道源代码,而且源代码太长了也不好控制) 使用exec族函数运行新的可执行程序。...exec族函数可以直接把一个编译好的可执行程序直接加载运行。 有了exec族函数后,典型打父子进程程序是这样的:子进程需要运行的程序被单独编写、单独编译链接成一个可执行程序(hello)。...if( fork() == 0 ) { printf("4------------execvp------------\n"); if( execvp( "ls", arg )

    1.1K10

    【Linux】手把手教你制作一个简易shell——(进程创建fork进程替换wait与进程等待exec的应用)(自定义shell程序设计)

    本章主要内容面向接触过C++ Linux的老铁 主要内容含: 一.前置知识 【1】Shell和Bash简述 Shell 是一种命令行界面,是用户与系统之间的接口,允许用户执行命令来 管理系统资源、...: getUserCommand函数 分割字符串: commandSplit函数 执行对应的命令: execute函数 2.程序设计细节 设置一个命令行获取字符数组:usercommand 设置一个存储...分割字符串 // "ls -a -l" -> "ls" "-a" "-l" commandSplit(usercommand, argv); // 3....故采用行获取接口fgets command参数 接收命令行获取 字符数组usercommand ,我们输入命令后,最终你还是会输入\n——导致执行结果和shell之间出现空行;所以我们在输入完后要把...中的命令(通过环境变量) 于是我们设计出: fork函数创建子进程 子进程进行进程替换execvp函数,用到 分割usercommand数组后的字符串的地址——的指针数组argv 父进程等待子进程

    12510

    简单模拟实现shell(Linux)

    目录​​​​​​​ 前言 展示效果 实现代码 前言 该代码模拟了shell的实现,也就是解析类似于“ls -a -l"的命令,当我们启动我们自己写的shell的可执行程序时,我们输入"ls"的命令,也可以展示出在...shell中输入"ls"时同样的效果,一下为展示效果 展示效果 当我们在系统的shell下输入"ls"时,会显示 以下代码是我自主模拟实现shell的程序执行"ls"命令时的情况 是不是很类似呢...//使得ll命令也可以执行 if (strcmp(g_argv[0], "ll") == 0) { g_argv[0] = "ls"; g_argv[index...// printf("index = %d\n", index); // //检测分割是否正确 // for (index = 0; g_argv[index]; index++)//C99...(要父进程去执行命令,如cd命令) //目前写法发现:cd ~, cd -, rm等命令做不了 //错误写法 // if (g_argv[0] == "cd")

    16110
    领券