管道系统调用

发布于 2024-10-11 16:52:27 字数 73 浏览 4 评论 0原文

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

can someone give me simple example in c, of using pipe() system call to and use ssh to connect to a remote server and execute a simple ls command and parse the reply. thanks in advance,..

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

揽月 2024-10-18 16:52:27
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 的输出,因为任何程序都不应该这样做。当文件名包含空格时,它是不可靠的。

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;
    }
}

Note: the example doesn't parse the output from ls, since no program should ever do that. It's unreliable when filenames contain whitespace.

呢古 2024-10-18 16:52:27

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

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

pipe(2) creates a pair of file descriptors, one for reading, the other for writing, that are connected to each other. Then you can fork(2) to split your process into two and have them talk to each other via these descriptors.

You cannot "connect" to pre-existing process using pipe(2).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文