C程序中调用execvp打开nvim编辑文件失败,如何解决?
execvp调用nvim打开文件空白,system却正常的原因及解决办法
你的问题确实是execvp的用法有误,核心问题出在参数数组的构造上:
execvp要求传入的参数数组(第二个参数),第一个元素必须是被执行程序的名称(对应程序启动后的argv[0]),后续元素才是真正传递给程序的命令行参数。你现在直接把文件路径放在数组首位,nvim会把这个路径当成自己的程序名,而不是要打开的目标文件,所以它找不到要加载的内容,只能打开空白界面。
而system()是把整个字符串交给shell解析,shell会自动帮你拆分出程序名(nvim)和参数(/home/test/test.txt),所以能正常工作。
修正后的代码如下:
#include <stdio.h> #include <stdlib.h> #include <unistd.h> int main(int argc, char** argv) { // 修正参数数组:第一个元素为程序名,第二个为目标文件路径,末尾用NULL终止 char* arguments[] = {"nvim", "/home/test/test.txt", NULL}; execvp("nvim", arguments); // 现在可以正常打开文件了 // 如果execvp执行成功,下面的代码永远不会运行 perror("execvp执行失败"); system("nvim /home/test/test.txt"); return 0; }
补充说明:
- execvp会在系统PATH环境变量中查找第一个参数指定的程序(这里是"nvim")
- 参数数组必须以NULL结尾,这是exec系列函数的要求
- 如果execvp调用成功,当前进程会被替换成nvim,所以后面的代码不会执行;只有调用失败时才会走到perror和system的逻辑
内容的提问来源于stack exchange,提问作者adsf
相关产品推荐
相关产品推荐

