【问题标题】:Why does this program prints an empty line?为什么这个程序打印一个空行?
【发布时间】:2021-03-15 09:49:06
【问题描述】:

这个程序叫做program.c。当我运行./program echo test 时,我希望程序打印test,即使该命令是在子shell 中运行的。为什么输出是空行?它与文件路径有关吗?当我尝试./program /bin/echo test 时,我仍然得到一个空行输出。

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>

int function(char **argv) {
    execl("/bin/bash", "sh", "-c", *argv, argv, (char*)NULL);
}

int main(int argc, char **argv) {
    int return2;
    
    function(argv + 1);
}

【问题讨论】:

标签: c echo execl


【解决方案1】:

你的程序有两个问题。

第一个问题是argvexecl() 的参数并没有按照你的想法做。指针argv 是指向char * 的指针(即char **),并且只允许将char * 作为参数传递给execl()。也就是说,C 中的变量参数列表无法按照您的预期工作。

为了完成你想要的,考虑不使用execl(),而是使用execv(),传递一个你自己构建的char *s数组。您可以通过以下方式执行此操作,例如:

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>

int function(char **argv) {
    // Consider passing `argc` as well to eliminate
    // the need for this loop.
    int len = 0;
    while(argv[len]) {
        len++;
    }
    
    char *new_argv[len + 3];
    new_argv[0] = "sh";
    new_argv[1] = "-c";
    for(int i = 0; i <= len; i++) {
        new_argv[i + 2] = argv[i];
    }
    
    execv("/bin/bash", new_argv);
}

int main(int argc, char **argv) {
     function(argv+1);
}

但是,您仍然有一个问题:./program echo test 仍然会打印一个空行,因为如果您在终端中执行sh -c echo test,您只会得到一个空行!为了解决这个问题,您需要执行./program 'echo test'(对应于终端的sh -c 'echo test'),然后它应该可以工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-26
    • 2011-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多