2011-01-13 448 views
3

可以有人給我簡單的例子中C,使用配管()系統調用來的和使用ssh連接到遠程服務器,並執行一個簡單的ls命令和解析的答覆。由於事先..管系統調用

+0

您可能需要更新您對管道及SSH的問題。 – 2011-01-13 14:12:38

+0

他們可能可以。但是這將是兩個不同的例子 - 一個用於pipe(),另一個用於ssh()。 – 2011-01-13 14:19:00

回答

5
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

pipe(2)創建一對文件描述符,一個用於讀取,另一個用於寫入,連接到彼此的。然後你可以fork(2)把你的進程分成兩部分,讓它們通過這些描述符相互交談。

你不能「連接」使用pipe(2)到預先存在的過程。