2013-05-10 47 views
0

所以我们必须创建一个程序来创建3个子进程,它们将信息彼此传递。有人可以帮我完成管道上的任务吗?

  • 第一个进程从文件读入数据。
  • 第二个过程通过转换每个字母上的上限(即小写字母转换为大写字母,反之亦然)来更改该数据。
  • 第三个进程将信息写入文件。

我的问题是,我似乎无法使用fork()waitpid()来运行进程。对于waitpid(),我真的不知道第二和第三个参数属于什么。这是我的主:

#include <windows.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <ctype.h> 
#include <sys/types.h> 
#include <sys/wait.h> 
#include "pipe.c" 


int main(void) { 

int p, p2, rc, rc2; 
rc = _pipe(f_des); 
rc2 = _pipe(C1C2); 

pid_t pid[3]; 

pid[0] = fork(); 
if (pid[0] == 0) { 
    puts("create child 1"); 
    do_child0(); 
    exit(0); 
} 
pid[1] = fork(); 
if (pid[1] == 0) { 
    puts("create child 2"); 
    do_child1(); 
    exit(0); 
} 
pid[2] = fork(); 
if (pid[2] == 0) { 
    puts("create child 3"); 
    do_child2(); 
    exit(0); 
} 

waitpid(pid[0], NULL, 0); 
waitpid(pid[1], NULL, 0); 
waitpid(pid[2], NULL, -1); 
printf("children done, parent goes"); 

return 0; 
} 

pipe.c:

#include "pipe.h" 

void do_child1() { 

int c, p2; 
int rc, rc2; 
char *line2, *line3; 
int i = 0; 
int j = 0; 
int k = 0; 
char buffer[80]; 
//char *line; 

close(f_des[1]); 
close(C1C2[0]); 
printf("Received by child 2 from child 1: "); 

while(k<26) { 
for (i = 0; i <= 40; i++) { 
    if ((read(f_des[0], buffer, 1)) != '\0') { 
//while((rc = read(f_des[0], buffer, 40))) { 
    printf("%s", buffer); 
    j = 0; 
    line2 = (char *)malloc(sizeof(char)*40); 
    read(f_des[0], buffer, 40); 
    line2 = buffer; 
    line3 = (char *)malloc(sizeof(char)*40); 
    line2 = line3; 

    rc = read(f_des[0], line2, 40); 
    printf("%s\n",line2); 
    while(j < 40) { 
     if(islower(*(line3+j))) 
      *(line3+j) = toupper(*(line3+j)); 
     if(isupper(*(line2+j))) 
      *(line3+j) = tolower(*(line3+j)); 
     } 
    rc2 = write(C1C2[1], line3, 40); 
    printf("\nLine 3: %s", line3); 

    k++; 
} 
} 
} 

printf("\n"); 
close(C1C2[1]); 
close(f_des[0]); 
exit(0); 
} 

void do_child2() { 
int c; 
int rc; 
char *line4; 

close(C1C2[1]); 

while((rc= read(C1C2[0], line4, 40)>0)) { 
    line4 = (char*)malloc(sizeof(char)*40); 
    printf("%s\n", line4); 
} 

FILE *file; 
file = fopen("C:\\Users\\apkim_000\\Desktop\\newReluctance.c", "a+"); 
fprintf(file, "%s", line4); 
fclose(file); 




} 



void do_child0() { 
FILE *inf = fopen("C:\\MinGW\\bin\\Reluctance.c", "r"); 
int c; 
int rc; 
int i =0; 
char buffer[80]; 
char *line; 
cntr = 0; 
close(f_des[0]); 

printf("From child 1: \n"); 
while (1) { 
    fgets(buffer, 100, inf); //reads in at most 80 char from a line 
    if (feof(inf)) //this checks to see if the special EOF was read 
     break;  //if so, break out of while and continue with your main 
    line = (char*)malloc(sizeof(char)*40); 
    line = strtok(buffer, "\n"); 
    printf("%s\n", line); 
    i++; 
    cntr++; 
    write(f_des[1], buffer, 40); 
} 
close(f_des[1]); 

exit(0); 

} 

pipe.h:

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


void do_child1(); 
void do_child2(); 
void do_child0(); 

int f_des[2]; 
int C1C2[2]; 
int cntr, p3; 

编译器输出:

create child 1 
From child 1: 
Reluctance 
OUT through the fields and the woods 
And over the walls I have wended; 
I have climbed the hills of view 
And looked at the world, and descended; 
I have come by the highway home, 
And lo, it is ended. 
The leaves are all dead on the ground, 
Save those that the oak is keeping 
To ravel them one by one 
And let them go scraping and creeping 
Out over the crusted snow, 
When others are sleeping. 
And the dead leaves lie huddled and still, 
No longer blown hither and thither; 
The last lone aster is gone; 
The flowers of the witch-hazel wither; 
The heart is still aching to seek, 
But the feet question 'Whither?' 
Ah, when to the heart of man 
Was it ever less than a treason 
To go with the drift of things, 
To yield with a grace to reason, 
And bow and accept the end 
create child 2 
Received by child 2 from child 1: RUT through the fields and the woods 
create child 3 

回答

0

我看到的第一件事情,但我并不太自信,因为它密集的代码就是y你应该只等待执行时间最长的孩子。如果你不知道哪一个孩子的过程是,你最好的办法就是等待一个先决条件,或让每个孩子创建下一个孩子,这样父母只需要等待一个孩子。

是的,让每个孩子都做好自己的工作,然后等待那个孩子,等到孩子退出时,主程序开始创建下一个孩子。没有理由让他们同时做这件事。

0

在担心waitpid()之前,您应该照顾do_child1()do_child0()do_child1()之间的管道工作正常,但do_child1()中的管线缓冲区管理是一团糟。 do_child0()总是每行写入40个字符,而do_child1()首先只读取1个字符(“R”),然后是40个字符(它丢弃),然后是另外40个字符(从第二行的第二个字符开始),产生输出“RUT通过田野和树林”。然后输入一个无限循环while(j < 40);因此,该程序不会继续。

相关问题