我有VLC(用于复制视频的程序)
如果我输入一个shell:
/ home / vlc" / home /我的电影/我想看的电影.mkv"
它打开了一个复制电影。
但是,当我运行以下程序时:
#include
int main(void) {
execl("/home/vlc","/home/my movies/the movie i want to see.mkv",NULL);
return 0;
}
vlc打开,但不复制任何内容。 我该如何解决?
我尝试过的事情:
我猜的
execl("/home/vlc","/home/my movies/the movie i want to see.mkv",NULL);
相当于在外壳中输入:
/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 ....无济于事。
帮帮我!!!!
execl失败后为什么不看errno? 它本可以告诉您更多有关您的问题的信息。 仔细阅读execl手册页会变成什么? :-)
execl("/home/vlc",
"/home/vlc","/home/my movies/the movie i want to see.mkv",
(char*) NULL);
您需要指定所有参数,其中包括argv[0],而不是从可执行文件中获取的。
还要确保将最终的NULL强制转换为char*。
详细信息在这里:http://pubs.opengroup.org/onlinepubs/9699919799/functions/exec.html
为什么/ home / vlc需要指定两次?
第一个是完整路径,第二个是进程名称,通常第二个参数中的" vlc"就足够了
它应该是... , (char*) NULL);
@alk,的确如此。 (但是我不知道有多少当前实现会使用裸NULL来工作,因为将NULL定义为(void *)0或0L变得流行起来,使得缺少对NULL的强制转换可以在可变参数函数中实际使用;甚至传递了如果不是全部(不是全部),则裸裸0可以在大多数32位ABI和IIRC上工作,在某些64位ABI上(例如Linux使用的那一种)。
为什么我们必须强制转换为NULL?
如果NULL定义为0且sizeof(char *)!= sizeof(int)
如果您只需要执行VLC播放过程,并且仅在完成时将控制权交还给您的应用程序过程,而没有什么更复杂的了,那么我想您可以使用:
system("The same thing you type into console");
在解决execl参数中的细微误解和编写将正确引用以使shell可以撤消引用的函数之间,我知道我想要什么。
我想我明白你的意思,你的偏爱是合理的。但是,当处理这样简单的需求时,除了避免与system()中的转义序列反斜杠混淆之外,使用execl()代替system()还有其他好处吗?
出于安全原因,例如,如果您创建了一个像sprintf(buf,"ls -la %s", var)这样的字符串,并使用system(buf)执行该字符串,则有人可以给您一个文件名,例如"somefile; rm -rf ~"。