如何使用正确的参数在C中调用execl()?

如何使用正确的参数在C中调用execl()?,c,exec,external,quotes,unistd.h,C,Exec,External,Quotes,Unistd.h,我有vlc(复制视频的程序) 如果我键入shell: /home/vlc”/home/my movies/我想看的电影。mkv“ 它打开了一个复制电影的窗口 但是,当我运行以下程序时: #include <unistd.h> int main(void) { execl("/home/vlc", "/home/my movies/the movie i want to see.mkv",NULL); return 0; } 相当于在shell中键入: /home/vl

我有vlc(复制视频的程序) 如果我键入shell:

/home/vlc”/home/my movies/我想看的电影。mkv“

它打开了一个复制电影的窗口

但是,当我运行以下程序时:

#include <unistd.h>

int main(void) {

  execl("/home/vlc", "/home/my movies/the movie i want to see.mkv",NULL);

  return 0;
}
相当于在shell中键入:

/home/vlc /home/my movies/the movie i want to see.mkv
这不管用,所以我试过了

 execl("/home/vlc", "\"/home/my movies/the movie i want to see.mkv\"",NULL);
vlc打开了,但也不能复制

我没有在末尾写入NULL,而是尝试了0,(char*)0,1。。。。没有帮助。 救命啊

您需要指定所有参数,包括
argv[0]
,这些参数不是从可执行文件中获取的

还要确保最后的
NULL
转换为
char*


详细信息如下:

如果您只需要执行VLC播放过程,并且只需要在完成后将控制权交还给应用程序过程,并且没有更复杂的内容,那么我想您可以使用:


system(“与您在控制台中键入的内容相同”)

执行失败后,为什么不查看
错误号
?它会告诉你更多关于你的问题。仔细阅读execl手册页会怎么样?:-)在修正execl参数中的细微误解和编写一个正确引用的函数以便shell可以撤销引用之间,我知道我更喜欢什么。我想我明白你的意思,你的选择是合理的。但是,在处理这些简单的需求时,除了避免在system()中弄乱转义序列反斜杠之外,使用execl()代替system()还有其他好处吗?如果您创建了一个字符串,例如,
sprintf(buf,“ls-la%s”,var)
,并使用
system(buf)执行,那么可能会有安全原因
,有人可能会给你一个文件名,例如,
“somefile;rm-rf~”
。为什么需要指定两次/home/vlc?第一个是完整路径,第二个是进程名,通常第二个参数中的“vlc”就足够了。它应该是
,(char*)空)@alk,真的。(但我想知道目前有多少实现不适用于裸空,因为将空定义为(void*)0或0L变得流行,使得不使用强制转换空在实践中适用于可变函数;即使传递裸空0也适用于大多数(如果不是全部)32位ABI和IIRC,某些64位ABI,如Linux使用的)。如果NULL定义为0且sizeof(char*)!=sizeof(内部)
 execl("/home/vlc", "\"/home/my movies/the movie i want to see.mkv\"",NULL);
execl("/home/vlc", 
  "/home/vlc", "/home/my movies/the movie i want to see.mkv", 
  (char*) NULL);