Не могу заставить мой счетчик слов в C работать с использованием дочерних процессов

Поэтому мое назначение - создать программу подсчета слов (снова), используя разные дочерние идентификаторы для каждой функции. У меня все работает довольно хорошо, за исключением двух небольших проблем, которые я не могу обернуть вокруг себя.

-При передаче тестового документа в мою программу ($./mywc2 testdoc) командная строка напечатает процесс дважды:

colin @ Colins-Samsung: ~ / Документы / Домашняя работа и слайды $./mywc2 testdoc

Это дочерний процесс 54473920, количество строк равно 4 Это дочерний процесс 32744, количество слов равно 21 Это дочерний процесс 52242236, количество символов равно 77

Это дочерний процесс 54473920, количество строк равно 4 Это дочерний процесс 32744, количество слов равно 21 Это дочерний процесс 52242236, количество символов равно 77

иногда мои процессы имеют отрицательные значения (только количество строк и количество символов). Я читал, что это потому, что система не хочет инициализировать два новых процесса одновременно, поэтому я попытался реализовать вызов ожидания, но я не уверен, как или когда положить его.

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <errno.h>
#define IN 1
#define OUT 0

int countLines(int childId)
{
getpid();
}
int countWords(int childId){
getpid();
}
int countChar(int childId){
getpid();
}

main(int argc, char *argv[]){
int pids[4];
int n=2;
int fd;
char buf[1000];
int charRead;
int nl=0;
int nw=0;
int nc=0;
int i;
int j;
int state=OUT;

int pid=fork();


fd=open(argv[1],O_RDONLY,0644);
if (fd==-1)
{ 
printf("errno=%d\n",errno);
perror("main");
}

//old mywc code block
charRead=read(fd, buf, 1001);
for (i=0; buf[i]; i++)
{
if(buf[i]!=' ')
{
    nc++;
}
if(buf[i]=='\n')
{
    nl++;
}
if(buf[i]==' '|| buf[i]=='\n' || buf[i]=='\t')
{
    state=OUT;
}
else if(state==OUT)
{
    state=IN;
    ++nw;
}
}
 close(fd);


//children block
//int pid=fork();

for(j=0;j<2;++j)
{
if(pid==0)
{
    if(j==0)
    {       
        countLines(j);

    }
    else if(j==1)
    {
        countWords(j);
        wait(100);
    }
    else if(j==2)
    {
        countChar(j);

}
}
else if(pid!=0)
{
    perror("fork");
    abort();
}
}
wait(10);


printf("This is child process %d, the number of lines is %d\n",pids[0], nl);
printf("This is child process %d, the number of words is %d\n",pids[1], nw);
printf("This is child process %d, the number of characters is %d\n",pids[2], nc);
printf("\n");
close(fd);


}

0 ответов

Другие вопросы по тегам