为什么这个程序打印一个空行?
Why does this program prints an empty line?
这个程序叫做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);
}
你的程序有两个问题。
第一个问题是 argv
到 execl()
的参数与您认为的不一样。指针 argv
是指向 char *
的指针(即 char **
),并且只允许将 char *
作为参数传递给 execl()
。也就是说,C 中的可变参数列表无法按照您的预期工作。
为了完成你想要的,考虑不使用 execl()
而是使用 execv()
,传递你自己构造的 char *
数组。您可以通过以下方式执行此操作,例如:
#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'
),然后应该可以工作。
这个程序叫做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);
}
你的程序有两个问题。
第一个问题是 argv
到 execl()
的参数与您认为的不一样。指针 argv
是指向 char *
的指针(即 char **
),并且只允许将 char *
作为参数传递给 execl()
。也就是说,C 中的可变参数列表无法按照您的预期工作。
为了完成你想要的,考虑不使用 execl()
而是使用 execv()
,传递你自己构造的 char *
数组。您可以通过以下方式执行此操作,例如:
#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'
),然后应该可以工作。