C中的奇怪分叉()问题



这是一个基本mapReduce的赋值,用于查找文本文件中字符串的出现次数。

我有一个只调用spawnMapper()的main。

问题是fork()==0,但它不会进入该部分并打印"我成功了!"或其他任何内容。如果我将int pid设置为fork返回的值,或者如果我直接使用fork,这是真的。

请帮忙,它编译后就不起作用了,我很困惑。

#include <stddef.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include "reducer.h"
//parent = greater than 1 child = 0
char fpeek(FILE *file);
void spawnMapper(char* keyword, char* fileLocation, int numberMappers){
    FILE *fptr;
    if((fptr=fopen(fileLocation, "r")) == NULL){
        printf("ERROR! opening file");
        exit(1);
    }
    fseek(fptr, 0L, SEEK_END);
    int size = ftell(fptr);
    int mapperSize = size/numberMappers;
    fseek(fptr, 0L, SEEK_SET);
    int i;
    for(i = 0; i < numberMappers; i++){
        fptr = fopen(fileLocation, "r");
        int pToC[2]; //pipe parent to child
        int cToP[2]; //pipe child to parent
        if(pipe(pToC) == -1 || pipe(cToP) == -1){
            printf("pipe failure");
            exit(1);
        }
        if (fork() ==  0) {
            printf("I made it!");
            fptr = fopen(fileLocation,"r");
            int threadSize = 0;
            int found = 0;
            while(fpeek(fptr) != EOF && threadSize < mapperSize){
                fseek(fptr, i*mapperSize, SEEK_SET);
                char* stringCheck;
                fscanf(fptr, "%s", stringCheck);                
                if(strcmp(keyword, stringCheck) == 0){
                    found += 1;
                }
                threadSize += strlen(stringCheck);
            }
            printf("found %d", found);
            //pipes to parent how many found 
        }
        else{
        }
    }
    fclose(fptr);   
}
char fpeek(FILE *stream){
    char c;
    c = fgetc(stream);
    ungetc(c, stream);
    return c;
}
Kaylum在评论中指出printf是行缓冲的。这是一个常见的误解。它是行缓冲的stdin;其他功能(例如putchar)也受到影响。尽管如此,他的解决方案是正确的:打印一个换行符以强制立即打印整行。

或者,fflush(stdout);将使文本立即打印,而不需要换行符。

在我看来,Mike的建议不起作用,因为在程序运行之前,根本问题就与termios有关;终端处于cooked/canonical模式(这意味着termios将等到换行后再发送所有数据,这样它就可以代表应用程序处理诸如退格之类的事情)。如果你想将终端设置为原始模式,也就是说,只要按下键,字符就会被发送到你的程序中,这与C无关,但你可能想阅读这一页和这一页。。。

相关内容

  • 没有找到相关文章

最新更新