执行 execve() 的正确步骤是什么?
What is the correct step to execute execve()?
我们的作业需要使用pipe()、fork()、execve() 和dup() 来实现一个简单的带有管道的终端命令执行。因此,我了解了 dup 和 pipe 如何操作文件描述符,并生成了下面的代码。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void)
{
int pfds[2];
pipe(pfds);
if (!fork()) {
close(1); /* close normal stdout */
dup(pfds[1]); /* make stdout same as pfds[1] */
close(pfds[0]); /* we don't need this */
char *k = {"echo", "one", "two", "three", NULL};
execve("/bin/echo", k, NULL);
} else {
close(0); /* close normal stdin */
dup(pfds[0]); /* make stdin same as pfds[0] */
close(pfds[1]); /* we don't need this */
char *k = {"wc", "-w", NULL};
execve("/usr/bin/wc", k, NULL);
}
return 0;
}
看起来 运行 代码没有任何结果,我不确定我还需要什么才能让它工作。
我期待输出 3,您将通过输入
看到
echo one two three | wc -w
在终端中。顺便说一句,我使用的是 MacOS。
问题是您将字符串数组分配给 char*
。两个 k
都应声明为 char* k[] = …
。如果您的编译器没有对此发出警告,您需要启用更多警告。
与评论相反,您正确使用了 close
和 dup
(但 dup2
会更好)。
我们的作业需要使用pipe()、fork()、execve() 和dup() 来实现一个简单的带有管道的终端命令执行。因此,我了解了 dup 和 pipe 如何操作文件描述符,并生成了下面的代码。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void)
{
int pfds[2];
pipe(pfds);
if (!fork()) {
close(1); /* close normal stdout */
dup(pfds[1]); /* make stdout same as pfds[1] */
close(pfds[0]); /* we don't need this */
char *k = {"echo", "one", "two", "three", NULL};
execve("/bin/echo", k, NULL);
} else {
close(0); /* close normal stdin */
dup(pfds[0]); /* make stdin same as pfds[0] */
close(pfds[1]); /* we don't need this */
char *k = {"wc", "-w", NULL};
execve("/usr/bin/wc", k, NULL);
}
return 0;
}
看起来 运行 代码没有任何结果,我不确定我还需要什么才能让它工作。
我期待输出 3,您将通过输入
看到echo one two three | wc -w
在终端中。顺便说一句,我使用的是 MacOS。
问题是您将字符串数组分配给 char*
。两个 k
都应声明为 char* k[] = …
。如果您的编译器没有对此发出警告,您需要启用更多警告。
与评论相反,您正确使用了 close
和 dup
(但 dup2
会更好)。