2014-01-08 50 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