C中奇怪的fork()问题
这是基本mapReduce的赋值,用于查找文本文件中字符串的出现次数 我有一个只调用spawnMapper()的main 问题是fork()==0,但它不会进入该部分并打印“我做到了!”或其他任何内容。如果我将int-pid设置为fork返回的值,或者如果我直接使用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
#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
路径。