2014-01-08 49 views
0

我有execlp问题。当我不知道如何正确地将指针数组重定向到execlp。比如我想使用重定向到execlp()

ls -l | sort -n 

我的程序只需要“LS”和“排序”

 int pfds[2]; 
     pipe(pfds); 
     child_pid = fork(); 
     if(child_pid==0) 
     {  
     close(1); 
      dup(pfds[1]); 
      close(pfds[0]); 
      execlp(*arg1, NULL); 

     } 
     else 
     { 
     wait(&child_status); 
      close(0); 
     dup(pfds[0]); 
     close(pfds[1]); 
      execlp(*arg2, NULL); 
     } 

所有的命令都是指针数组,其中:ls -l是在第一个表和sort -n在第二

+0

你最大的问题是让'ls'上的父'wait'然后exec'sort'是错误的方法。 – Duck

+0

你是否建议删除等待命令? – user3174326

+2

不,你应该'叉'两个孩子(在这种情况下)形成一条管道。这个原理现在的作用是,你可能已经列出了小的dirs。如果你是一个较大的那个,你的'ls'将写入管道,直到它填充PIPE_BUF字节,然后它将在写入时被阻塞(因为没有读取它)并且永不结束。你会永远等待一些不会结束的事情(自己)。 – Duck

回答

0

您可能想使用dup2重定向stdin和stdout。你也没有正确使用execlp。它期望可变数目的参数由NULL指针终止。正如评论所建议的那样,等待命令不应该在那里。

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 

int main() { 
    int pfds[2]; 
    pipe(pfds); 
    int child_pid; 
    child_pid = fork(); 
    if(child_pid==0) 
    {  
     dup2(pfds[1], 1); 
     close(pfds[0]); 
     execlp("ls", "-al", NULL); 

    } 
    else 
    { 
     dup2(pfds[0], 0); 
     close(pfds[1]); 
     execlp("sort", "-n", NULL); 
    } 
} 
+0

但是我不知道我的命令'ls -l | sort -n'就是例子。命令由用户给出。它可以是'ls -l |排序' – user3174326

+0

使用execv或execvp。 – Marian