Как использовать fork и ждать, пока дочерний процесс будет работать бесконечно? - PullRequest
1 голос
/ 12 ноября 2019

Я создаю программу, в которой я должен позволить пользователю ввести длину слова с количеством слов, соответствующих этой длине, которая будет возвращена.

Я завершил этот аспектit

Моя проблема заключается в следующем: у меня должен быть дочерний процесс для подсчета и возврата слов, соответствующих длине, прежде чем снова попросить пользователя ввести другую длину. Однако, если строка определенной длины равна 0, предполагается, что дочерний процесс повторяет счет бесконечно, и завершается только с помощью отдельного терминала, не завершая родительский процесс.

Любая помощь приветствуется,

Мой код выглядит следующим образом

#include <iostream>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
using namespace std;

int WordsCount(char *string,int len){

    int count=0,Wordcount=0;

    while(*string){

        //Checks for Delimeter
        if (*string== ' ' || *string== ',' || *string== '\t' || *string== '\n' || *string== '.' || *string== '!' || *string == '\0'){

            if (count==len){ // Checks If calculated length equals to User given length
                Wordcount++;
                count=0;
                string++;
            }
            else{
                count=0;
            }
        }
        else{
            count++;
        }

        string++;
    }
    return Wordcount; //Returns The Final Count of Words
}

int main()
{
    const char string[] = "Maids table how learn drift but purse stand yet set. Music me house could among oh as their."
    "Piqued our sister shy nature almost his wicket. Hand dear so we hour to. He we be hastily offence effects he service."
    "Sympathize it projection ye insipidity celebrated my pianoforte indulgence. Point his truth put style."
    "Elegance exercise as laughing proposal mistaken if. We up precaution an it solicitude acceptance invitation."
    "Acceptance middletons me if discretion boisterous travelling an. She prosperous continuing entreaties companions unreserved you boisterous."
    "Middleton sportsmen sir now cordially ask additions for. You ten occasional saw everything but conviction. Daughter"
    "returned quitting few are day advanced branched. Do enjoyment defective objection or we if favourite. At wonder afford so danger cannot former seeing."
    "Power visit charm money add heard new other put. Attended no indulged marriage is to judgment offering landlord. Parish so enable innate in formed missed."
    "Hand two was eat busy fail. Stand smart grave would in so. Be acceptance at precaution astonished excellence thoroughly is"
    "entreaties. Who decisively attachment has dispatched. Fruit defer in party me built under first. Forbade him but savings"
    "sending ham general. So play do in near park that pain.";

    int Length;

    printf("Enter Word Length?\n");

    scanf("%d",&Length);           //Reading Length of the word from User

    int result = WordsCount(string,Length);   // Return Count Storing.

    printf("Count = %d\n",result);

    return 0;
}

Ответы [ 2 ]

1 голос
/ 12 ноября 2019

Я не уверен, но попробуйте.

    pid_t ret;
    int w,status;
ret = fork();
if(ret==-1){
    perror("Fork");
}
else if(ret==0) {
    printf("Enter Word Length?\n");
    scanf("%d",&length);
    int result=WordsCount(string,Length);
    if (result==0) {
        exit(1);
    }else{
        printf("Count = %d \n",result);
    }
}else{
    printf("Enter Word Length?\n");
    scanf("%d",&length);
    w = wait(&status);
    int result = WordsCount(string,Length);
}
0 голосов
/ 12 ноября 2019

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

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

независимо от вашего выбора, вы можете легко найти образец кода для этого с помощью небольшого поиска Google. Относительно того, как прервать дочерний поток / процесс из другого терминала, нет простого способа, поскольку он будет запускаться в фоновом режиме.

трудный путь: заставить дочерний элемент прослушивать сокет и заставить его выходить при получении сообщения.

более простой способ: заставить дочерний элемент создать файл при запуске и контролировать, что файлвсе еще существуют в каждом цикле. Сделайте дочерний выход, если файл удален.

Другим способом (более элегантным) может быть использование сигнала linux. реализовать прослушиватель сигналов и остановить его, если он ловит сигнал SIGUSR1 или SIGUSR2. см. «сигнал человека 2», чтобы получить помощь. Недостатком является то, что если ваш родительский процесс / поток запускает несколько дочерних процессов, все они остановятся при получении сигнала (остановка определенного дочернего элемента невозможна)

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...