有人可以帮我完成管道上的这项作业吗?

标签 c pipe

因此我们必须创建一个程序来创建 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;
}

管道.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

最佳答案

我看到的第一件事,但我不太有信心,因为它的代码密集,你应该只等待执行时间最长的子进程。如果您不知道哪个子进程,最好的选择是等待 fifo 或让每个子进程创建下一个子进程,以便父进程只需等待一个子进程。

是的,让每个子进程完成其工作,并等待该子进程,当它退出时,主程序然后开始创建下一个子进程。没有理由让他们同时做这件事。

关于有人可以帮我完成管道上的这项作业吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16490077/

相关文章:

c++ - ptrdiff_t 太小?

c - 从 Beep() 中删除 sleep ,这是产生声音的替代方法?

hadoop - CLOUDERA 中的管道 (C++)

pipe - 在 Julia 中捕获进程的输出

cocoa - 将 NSTask 与 NSPipe 和 Perl 脚本结合使用,生成另一个进程

unix - 对 stdin 和 stdout 使用相同的文件进行重定向

C、将一个指向值赋给一个指向值,如*a=*b;

c - Windows 上的缓冲区溢出攻击导致访问冲突

c - 套接字发送和 EWOULDBLOCK

g++ - 在 g++ 中管道文件内容进行编译