2010-08-12 2 views
0

execlp, fork 및 파이프를 사용하여 간단한 프로그램을 만들려고 할 때 몇 가지 문제점이 있습니다. 현재 사용중인 프로그램은 "last | head -5 | sort"를 수행하도록 제안되었지만 작동하지 않습니다. 여기에 코드가 있습니다.유닉스에서의 다중 프로그래밍

#include <string.h> 
#include <fcntl.h> 
#include <stdio.h> 
#include <errno.h> 
#include <sys/types.h> 
#include <sys/stat.h> 

//last |head -5| sort 
int main(int argc, char* argv[]){ 

int buzon[2]; 
int buzon2[2]; 

if(pipe(buzon) < 0) 
    error("error de pipe"); 

switch(fork()){ 

    case -1: 
    error("error de fork"); 

    case 0: 
    if(close(1) < 0) error("error de close"); 
    if(dup(buzon[1]) < 0) error("error de dup"); 
    if(close(buzon[0]) < 0) error("error de close"); 
    if(close(buzon[1]) < 0) error("error de close"); 
    execlp("last", "last", NULL); 
    error("error de execlp"); 

} 



switch(fork()){ 

    case -1: 
    error("error de fork"); 

    case 0: 
    if(close(0) < 0) error("error de close"); 
    if(close(1) < 0) error("error de close"); 
    if(dup(buzon[0]) < 0) error("error de dup"); 
    if(dup(buzon[1]) < 0) error("error de dup"); 
    if(close(buzon[0]) < 0) error("error de close"); 
    if(close(buzon[1]) < 0) error("error de close"); 
    execlp("head", "head", "-n 5", NULL); 
    error("error de execlp"); 


} 


switch(fork()){ 
    case -1: 
    error("error de fork"); 
    case 0: 
    if(close(0)<0) error("error de close"); 
    if(dup(buzon[0]) != 1) error("error de dup"); 
    if(close(buzon[0]) < 0) error("error de close"); 
    if(close(buzon[1]) < 0) error("error de close"); 
    execlp("sort", "sort", NULL); 
    error("error de execlp"); 
} 


if(close(buzon[0]) < 0) error("error de close"); 
if(close(buzon[1]) < 0) error("error de close"); 
while(wait(NULL) != -1); 





} 

무엇이 실패했는지에 대한 아이디어. 문제는 2 개의 파이프를 사용할 때입니다. 제가 파이프를 1 개만 사용하는 프로그램을 만들면 작동합니다.

+0

당신이 오류 메시지 나 errno에 번호가 있습니까? –

답변

0

실제로 두 번째 파이프를 만든 다음 head 프로세스의 stdout과 sort 프로세스의 stdout에 사용해야합니다. 두 번째 fork()의 시점에서 :

close(buzon[1]); 
pipe(buzon2); 

/* Now buzon[0], buzon2[0] and buzon2[1] are still open in this process */ 

switch(fork()){ 

    case -1: 
    error("error de fork"); 

    case 0: 
    if(close(0) < 0) error("error de close"); 
    if(close(1) < 0) error("error de close"); 
    if(dup(buzon[0]) < 0) error("error de dup"); 
    if(dup(buzon2[1]) < 0) error("error de dup"); 
    if(close(buzon[0]) < 0) error("error de close"); 
    if(close(buzon2[0]) < 0) error("error de close"); 
    if(close(buzon2[1]) < 0) error("error de close"); 
    execlp("head", "head", "-n 5", NULL); 
    error("error de execlp"); 
    exit(1); 
} 

close(buzon[0]); 
close(buzon2[1]); 
/* Now buzon2[0] is still open in this process */ 

switch(fork()){ 
    case -1: 
    error("error de fork"); 
    case 0: 
    if(close(0)<0) error("error de close"); 
    if(dup(buzon2[0]) < 0) error("error de dup"); 
    if(close(buzon2[0]) < 0) error("error de close"); 
    execlp("sort", "sort", NULL); 
    error("error de execlp"); 
    exit(1); 
} 

close(buzon2[0]); 

(당신해야 또한 exit()execlp() 오류 후 자식 프로세스)

+0

그런 다음 실행하면 다음 오류가 발생합니다. 헤드 : 쓰기 오류 : 파일 설명자가 잘못되었습니다. 아이디어가 있으십니까? – olbrich

+0

@olbrich : 나에게 잘 돌아 간다. 아마도 당신은'buzon [1] '이 아니라'head' 경로에서'buzon2 [1]'에'dup() '?) – caf

+0

이제는 잘 돌아 간다. buzon2 [1]과 buzon [1]을 dup()에서 혼동했다. 고마워요! – olbrich

관련 문제