在 ac 程序中执行带选项的命令

发布于 2024-10-31 12:49:27 字数 447 浏览 0 评论 0原文

我正在尝试在 ac 程序中执行带有参数的命令。 例如,当用户使用以下命令执行我的程序时: "./a.out ls -la"

程序应使用 la 选项执行 ls。

但我不知道该怎么做。

我的程序使用fork。

我尝试这种方式:

pid = fork();

if(pid == 0){

execvp(argv[1], &argv[2]);

}else{

wait(NULL);

}

但它不起作用。

我想将数组作为 execvp 的第二个参数传递,并在命令中传递参数,但我对指针有点困惑(更多的是指针的指针:s)。

我知道这不起作用,因为参数中的破折号,但即使我不使用破折号,程序也只会启动“ls”而不处理“la”选项。

如果有人可以帮助我,我会很高兴知道该怎么做。

谢谢。

I'm trying to execute a commande with arguments in a c program.
For example when the user execute my program with:
"./a.out ls -la"

The program should execute ls with the la options.

But I don't know how to do that.

My program use a fork.

I try this way :

pid = fork();

if(pid == 0){

execvp(argv[1], &argv[2]);

}else{

wait(NULL);

}

But it does not work.

I want to pass as a second argument of execvp the array with the args passing in the command but i'm a little confuse with pointers (and so more with pointer of pointers :s) .

I know this souldn't work because of the dash in arguments but even if I don't use the dash, the program only launch the 'ls' without taking care of the 'la' options.

If someone could help me I would be happy to know the good way to do.

Thank you.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

南冥有猫 2024-11-07 12:49:27

系统

引用维基百科:

在C标准库中,system是一个用于执行子进程和命令的函数。它在 stdlib.h 头文件中定义。它与 exec/spawn 系列函数的不同之处在于,它不是将参数传递给执行的对象,而是将单个字符串传递给系统 shell,通常是 POSIX shell,/bin/sh -c。

http://en.wikipedia.org/wiki/System_(C_standard_library)

system

Quoth Wikipedia:

In the C standard library, system is a function used to execute subprocesses and commands. It is defined in stdlib.h header. It differs from the exec/spawn family of functions in that instead of passing arguments to an executed object, a single string is passed to the system shell, typically the POSIX shell, /bin/sh -c.

http://en.wikipedia.org/wiki/System_(C_standard_library)

执手闯天涯 2024-11-07 12:49:27

这里有几个问题。

  1. 您不处理 fork() 失败的情况。

  2. 您不处理 execvp() 失败的情况。如果您打印 strerror(errno) 它可能会告诉您 exec 失败的原因。

  3. execvp() 采用 char* const< 数组/code> 必须将 NULL 作为其最后一个元素。此外,第一个元素应该是程序的名称。这是一种约定,但它确实意味着,在您的示例中,参数相差一。即ls认为它是通过-la命令调用的,并且没有参数。我不确定 argv[] 是否保证在结束后有一个 NULL 指针,所以不要直接使用它。例如

    char* args[3];
    args[0] = argv[1]; // 你已经检查过 argc 至少是 3 对吗?
    args[1] = argv[2];
    参数[2] = NULL;
    // 然后在子进程中进行分叉和错误检查
    
    int 结果 = execvp(argv[1], args);
    // 如果到这里执行失败,则进行适当处理
    

  4. 您需要检查wait()的退出值,并且应该传递一个合法的int指针,以便您可以诊断任何问题。

Several problems here.

  1. you do not handle the case where fork() fails.

  2. you do not handle the case where execvp() fails. If you print strerror(errno) it might give you a clue as to why your exec is failing.

  3. execvp() takes an array of char* const which must have NULL as its last element. Also, the first element should be the name of the program. This is a convention, but it does mean that, in your example the arguments are off by one. i.e. ls thinks it has been invoked with a command of -la and no arguments. I'm not sure that argv[] is guaranteed to have a NULL pointer after the end, so don't use it directly. e.g.

    char* args[3];
    args[0] = argv[1]; // You have already checked argc is at least three right?
    args[1] = argv[2];
    args[2] = NULL;
    // do your fork and error check then in the child
    
    int result = execvp(argv[1], args);
    // if you get here exec failed, handle as appropriate
    
  4. You need to check the exit valueof wait() and you should pass a legitimate int pointer so that you can diagnose any issues.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文