首页
学习
活动
专区
工具
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”) 。这样就像命令列表 通过这些函数也可以进行执行我们缩写的程序!!!

8610

【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(

7410

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命令 对于一个自制

91720

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.1K60

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 }

8710

exec族

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

1.1K10

简单模拟实现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")

14410

温故Linux后端编程(二):进程

一堆官方话,就·一段程序的执行过程。...肯定有父进程) (2)在内核中建立进程结构 (3)将结构插入到进程列表,便于维护 (4)分配资源给该进程 (5)复制父进程的内存映射消息 (6)管理文件描述符和链接点 (7)通知父进程 下面是一张进程列表的图,命令...exec族 fork子进程是为了执行新程序(fork创建了子进程后,子进程和父进程同时被OS调度执行,因此子进程可以单独的执行一个程序,这个程序宏观上将会和父进程程序同时进行) 使用exec族函数运行新的可执行程序...看一下后缀: 后缀 功能 l 希望接收以逗号分隔的参数列表,列表以NULL指针作为结束标志 v 希望接收到一个以NULL结尾的字符串数组的指针 p 是一个以NULL结尾的字符串数组指针,函数可以DOS的...if( fork() == 0 ) { printf("4------------execvp------------\n"); if( execvp( "ls", arg )

69920

Linux下exec函数族详解

、代码段和堆栈段,那么当前的进程就开始执行A中的内容,这一过程中不会创建新的进程,而且PID也没有改变。...execvpe(const char *file, char *const argv[],char *const envp[]);        它们都是以exec为前缀,那么不同的之后后面的一些字符,l表示命令行参数列表...", "ls", "-l", NULL); perror("execl"); exit(1); }        这个程序很简单,就是用当前的进程调用ls这个可执行程序,...由于execl成功调用后这个进程的代码段都被替换了,自然下面的代码就不会执行了,所以也就没有返回值了,但是当调用失败后就会返回-1并设置errno值。...那么在成功调用后实际上这个进程就变成了ls,然后执行ls -l命令,因为我们用的是execl函数,所以第一个参数就需要用ls的所在目录,第二个参数其实没有实际意义,因为已经指定了ls的所在位置,所以第二个参数随便设置就可以但是不可以没有

8.4K30
领券