Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中奇怪的fork()问题_C_Mapreduce_Operating System_Fork - Fatal编程技术网

C中奇怪的fork()问题

C中奇怪的fork()问题,c,mapreduce,operating-system,fork,C,Mapreduce,Operating System,Fork,这是基本mapReduce的赋值,用于查找文本文件中字符串的出现次数 我有一个只调用spawnMapper()的main 问题是fork()==0,但它不会进入该部分并打印“我做到了!”或其他任何内容。如果我将int-pid设置为fork返回的值,或者如果我直接使用fork,这是正确的 请帮帮我,它已经编译好了,只是不起作用,我很困惑 #include <stddef.h> #include <string.h> #include <unistd.h> #in

这是基本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;
}
#包括
#包括
#包括
#包括
#包括
#包括“减速器.h”
//父项=大于1子项=0
字符fpeek(文件*文件);
void spawnMapper(char*关键字、char*文件位置、int numberMappers){
文件*fptr;
if((fptr=fopen(fileLocation,“r”))==NULL){
printf(“错误!打开文件”);
出口(1);
}
fseek(fptr,0L,SEEK_END);
int size=ftell(fptr);
int mapperSize=大小/数字映射;
fseek(fptr,0L,SEEK_SET);
int i;
对于(i=0;i
Kaylum在评论中指出,
printf
是行缓冲的。这是一种常见的误解。它是
stdin
的行缓冲;其他功能(例如,
putchar
)也会受到影响。尽管如此,他的解决方案是正确的:打印换行符以强制立即打印整行

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


在我看来,Mike的建议似乎行不通,因为根本的问题与程序运行之前的termios有关;终端处于cooke/canonical模式(这意味着termios将在发送所有数据之前等待换行符,以便它可以代表应用程序处理诸如退格之类的事情)。如果您想将终端设置为原始模式,这意味着只要按下键,字符就会被发送到您的程序中,这与C无关,但您可能需要阅读并…

Kaylum在注释中指出,
printf
是行缓冲的。这是一种常见的误解。它是
stdin
的行缓冲;其他功能(例如,
putchar
)也会受到影响。尽管如此,他的解决方案是正确的:打印换行符以强制立即打印整行

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


在我看来,Mike的建议似乎行不通,因为根本的问题与程序运行之前的termios有关;终端处于cooke/canonical模式(这意味着termios将在发送所有数据之前等待换行符,以便它可以代表应用程序处理诸如退格之类的事情)。如果您想将终端设置为原始模式,这意味着只要按下该键,字符就会被发送到您的程序,这与C无关,但您可能需要读取并…

printf
字符串的末尾加上“\n”
printf
是行缓冲的-在遇到新行字符之前,它不会刷新到标准输出。对于未初始化的用户来说,这是一个常见的陷阱,似乎某些代码段在执行时没有执行。您也可以直接将数据写入标准输出。我认为这是无缓冲的。也许可以尝试
char*buf=“屏幕上显示的任何内容”;ssize_t bytesprinted=写入(STDOUT、buf、strlen(buf))。唯一的问题是格式化字符不能像printf中那样工作。您不需要检查
fork()
调用是否成功执行。它可能失败了,您没有注意到它,因为它通过了
else
路径。请在
printf
字符串的末尾添加“\n”
printf
是行缓冲的-在遇到新行字符之前,它不会刷新到标准输出。对于未初始化的用户来说,这是一个常见的陷阱,似乎某些代码段在执行时没有执行。您也可以直接将数据写入标准输出。我认为这是无缓冲的。也许可以尝试
char*buf=“屏幕上显示的任何内容”;ssize_t bytesprinted=写入(STDOUT、buf、strlen(buf))。唯一的问题是格式化字符不能像printf中那样工作。您不需要检查
fork()
调用是否成功执行。它可能失败了,您没有注意到它,因为它通过
else
路径。