Не могу заставить мой счетчик слов в 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);
}