0

そのため、互いに情報を中継する 3 つの子プロセスを作成するプログラムを作成する必要があります。

  • 最初のプロセスは、ファイルからデータを読み込みます。
  • 2 番目のプロセスは、各文字の大文字を変換することによってそのデータを変更します (つまり、小文字から大文字へ、またはその逆)。
  • 3 番目のプロセスは、情報をファイルに書き込みます。

fork()私の問題は、とを使用してプロセスを実行できないように見えることですwaitpid()。についてwaitpid()は、正直なところ、2 番目と 3 番目の引数に何が属するのかわかりません。これが私のメインです:

#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;
}

パイプ.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);

}

パイプ.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
4

2 に答える 2

0

を心配する前にwaitpid()、世話をする必要がありdo_child1()ます。do_child0()との間のパイプはdo_child1()機能しますが、 のライン バッファ管理do_child1()がめちゃくちゃです。do_child0()は常に 1 行あたり 40 文字を書き込みますが、do_child1()最初は 1 文字 ("R") のみを読み取り、次に 40 文字 (破棄)、さらに 40 文字 (2 行目の 2 文字目から開始) を読み取り、出力 "RUT野原と森を抜けて」。その後、無限ループwhile(j < 40)に入ります。したがって、プログラムは続行されません。

于 2014-07-04T11:57:12.160 に答える