2014-02-18 26 views
0

我有一个程序,我想从一个子进程中排序文件中的第一列,并将输出返回到父进程。我如何从execlp中获取响应并打印它?以下是我迄今为止:从execlp获取回报()

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

#define WRITE 1 
#define READ 0 

int main(int argc, char **argv) 
{ 
    int i, k; 
    int p1[2], p2[2]; 

    int p1[2], p2[2]; 
    pid_t childID; 

    if (pipe(p1) < 0 || pipe(p2) < 0) { 
     perror("pipe"); 
     exit(0); 
    } 

    childID = fork(); 

    if (childID < 0) {  
     perror("fork"); 
     exit(0); 
    } 
    else if (childID == 0){         
     close(p1[WRITE]); 
     close(p2[READ]); 

     dup2(p1[READ], STDIN_FILENO); 
     close(p1[READ]); 
     dup2(p2[WRITE], STDOUT_FILENO); 
     close(p2[WRITE]); 

     execlp("sort", "-k1", "-n", "temp.txt", (char *)NULL); 
     perror("exec"); 
     exit(0); 
    } 
    else {             
     //parent process 
     //Not sure how to get response from exec 


    } 
} 

回答

0

通话execlp()后,当前进程的内存映像将被换成了所谓的progame,所以你不能得到你想要通过返回值是什么。你可以做的是让子进程将其结果写入其他地方,比如临时文件或管道,父进程从这个地方读取结果。

在正确设置管道以在父进程和子进程之间进行通信后,可以将子进程的结果写入其stdout,并从其标准输入读取父进程中的结果。

事情是这样的:

else if (childID == 0){         
    close(p1[READ]); 

    dup2(p1[WRITE], STDOUT_FILENO); 
    close(p1[WRITE]); 

    execlp("sort", "-k1", "-n", "temp.txt", (char *)NULL); 
    perror("exec"); 
    exit(0); 
} 
else {             
    close(p1[WRITE]); 

    dup2(p1[READ], STDIN_FILENO); 
    close(p1[READ]); 

    while (scanf("%ms ", &l) != EOF) { 
     printf("%s\n", l); 
     free(l); 
    } 
} 

这里是全码:

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

#define WRITE 1 
#define READ 0 

int main(int argc, char **argv) 
{ 
    int p1[2]; 
    char *l; 

    pid_t childID; 

    if (pipe(p1) < 0) { 
     perror("pipe"); 
     exit(0); 
    } 

    childID = fork(); 

    if (childID < 0) {  
     perror("fork"); 
     exit(0); 
    } 
    else if (childID == 0){         
     close(p1[READ]); 

     dup2(p1[WRITE], STDOUT_FILENO); 
     close(p1[WRITE]); 

     execlp("sort", "-k1", "-n", "temp.txt", (char *)NULL); 
     perror("exec"); 
     exit(0); 
    } 
    else {             
     close(p1[WRITE]); 

     dup2(p1[READ], STDIN_FILENO); 
     close(p1[READ]); 

     while (scanf("%ms ", &l) != EOF) { 
      printf("%s\n", l); 
      free(l); 
     } 
    } 

    return 0; 
} 

和测试文件temp.txt

$ cat temp.txt 
a 
e 
b 
d 
f 
c 

试运行的结果:

$ ./a.out 
a 
b 
c 
d 
e 
f 
+0

感谢您的回复。我如何才能写出儿童流程的结果? – kirax

+0

@kirax请尝试我已更新的答案中的代码。 –

+0

谢谢!我想是什么? – kirax