对于允许用户使用输入重定向运行任何shell命令的命令解释器,我尝试使用以下C代码将输入传递给命令。
这适用于实际使用管道输入(例如cat)的命令,但是对于忽略stdin(例如echo)的命令,管道会失败。
失败是无声的,没有错误指示,没有分段错误,没有消息。
我在Ubuntu 16.04上使用gcc 5和gcc 6进行测试。 我假设命令完成,以某种方式带管道,但为什么没有错误指示? 帮助赞赏。
#include <spawn.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/wait.h>
int main(int argc, char **argv) {
int in[2];
int pid;
posix_spawn_file_actions_t action;
char* spawnedArgs[] = { NULL, NULL };
int status;
const char* line = "123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 ";
int line_length = strlen(line);
if (argc < 3) { printf("syntax: spawn reps command\n"); return 1; }
int reps = atoi(argv[1]);
spawnedArgs[0] = argv[2];
pipe(in);
posix_spawn_file_actions_init(&action);
posix_spawn_file_actions_adddup2(&action, in[0], 0);
posix_spawn_file_actions_addclose(&action, in[1]);
posix_spawnp(&pid, spawnedArgs[0], &action, NULL, spawnedArgs, NULL);
close(in[0]);
for (int i = 1; i <= reps; i++)
{
printf("#%i: %zd\n", i, write(in[1], line, line_length));
}
close(in[1]);
printf("input piped\n");
wait(&status);
posix_spawn_file_actions_destroy(&action);
return 0;
}
这是失败命令的示例输出
$ ./spawn 100 "echo 123"
#1: 100
#2: 100
#3: 100
#4: 100
#5: 100
#6: 100
#7: 100
#8: 100
#9: 100