如果没有消耗,管道输入命令就会失败

时间:2018-04-12 15:07:28

标签: c pipe

对于允许用户使用输入重定向运行任何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

0 个答案:

没有答案