【问题标题】:pipe system call管道系统调用
【发布时间】:2011-01-13 14:08:03
【问题描述】:

谁能给我一个简单的 c 语言示例,使用 pipe() 系统调用和使用 ssh 连接到远程服务器并执行简单的 ls 命令并解析回复。提前谢谢,..

【问题讨论】:

  • 您可能想更新有关 pipe&ssh 的问题。
  • 他们可能可以。但这将是两个不同的例子——一个用于 pipe(),另一个用于 ssh()。

标签: c ssh posix pipe


【解决方案1】:
int main()
{
    const char host[] = "foo.example.com";  // assume same username on remote
    enum { READ = 0, WRITE = 1 };
    int c, fd[2];
    FILE *childstdout;

    if (pipe(fd) == -1
     || (childstdout = fdopen(fd[READ], "r")) == NULL) {
        perror("pipe() or fdopen() failed");
        return 1;
    }
    switch (fork()) {
      case 0:  // child
        close(fd[READ]);
        if (dup2(fd[WRITE], STDOUT_FILENO) != -1)
            execlp("ssh", "ssh", host, "ls", NULL);
        _exit(1);
      case -1: // error
        perror("fork() failed");
        return 1;
    }

    close(fd[WRITE]);
    // write remote ls output to stdout;
    while ((c = getc(childstdout)) != EOF)
        putchar(c);
    if (ferror(childstdout)) {
        perror("I/O error");
        return 1;
    }
}

注意:该示例不解析来自ls 的输出,因为任何程序都不应该这样做。当文件名包含空格时,它是不可靠的。

【讨论】:

  • 文件系统是这样的,它不包含空格..无论如何我可以使用输出来获取数据吗?我的意思是使用 ls 并将文件列表获取到结构或向量或列表或类似的东西???
  • 您在FILE * 流中获得ls 输出,因此您可以对流执行任何操作,fseek 除外。
  • 非常感谢。有用。我将如何更改多个命令的 pgm?就像一个 cd 命令,然后是一个 ls 命令。
  • 如果我正确理解你想在远程端执行cd ,那么你必须将它传递给ssh 命令。即execlp("ssh", "ssh", host, "(cd 'DIR' && ls)", NULL); 查看exec(3)ssh(1),如果要从用户输入中获取DIR 参数,请注意shell 引用规则。
【解决方案2】:

pipe(2) 创建一对文件描述符,一个用于读取,另一个用于写入,它们相互连接。然后您可以fork(2) 将您的进程分成两部分,并让它们通过这些描述符相互通信。

您无法使用pipe(2)“连接”到预先存在的进程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-07
    • 2020-09-14
    • 1970-01-01
    • 2021-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多