системный вызов - PullRequest
       18

системный вызов

3 голосов
/ 13 января 2011

Может ли кто-нибудь дать мне простой пример использования c (pipe) системного вызова и использования ssh для подключения к удаленному серверу, выполнения простой команды ls и анализа ответа.заранее спасибо ..

Ответы [ 2 ]

5 голосов
/ 13 января 2011
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, поскольку ни одна программа не должна этого делать. Ненадежно, когда имена файлов содержат пробелы.

1 голос
/ 13 января 2011

pipe(2) создает пару файловых дескрипторов, один для чтения, другой для записи, которые связаны друг с другом.Затем вы можете fork(2) разделить ваш процесс на два и заставить их общаться друг с другом через эти дескрипторы.

Вы не можете "подключиться" к существующему процессу, используя pipe(2).

...