c语言如何引用参数,关于exec:如何在C语言中使用适当的参数调用execl()?

我有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 ~"。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值