-1

私が開発している別の大規模なプログラムで発生した問題に対処するためだけに開発したこのコードがあります。

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <cstring> 
#include <cstdlib> 
#include <sys/types.h>
#include <sys/wait.h>
#include <errno.h>
#include <limits.h>
#include <string>
#include <iostream>

using namespace std;
void processLine (char []);
void readLine(char []);

const int LIMIT = 512;
int main(int argc, char *argv[])
{
    char oneLine[LINE_MAX];
    readLine(oneLine);
    
        
    return 0;
}
void readLine(char line[])
{
    processLine(line);
    

 //Otherstuff
 ------------

}
void processLine(char line[])
{
    
    pid_t process;
    int child_status;

    string input;
    cout << "Input: ";
    cin >> input;

    
        process = fork();
        if(process == 0)
        { // do nothing
        }
        else 
        {
                        //parent
                    if(input == "quit")
            {
                printf("Quit command found ! \nExiting ");
                    
                for(int i = 0;i < 3;i++)
                {
                    printf(".");
                    fflush(stdout);
                    sleep(1);
                    
                }
            
                printf("\n");
                    exit(0);            
            }
            else
            {
                wait(&child_status);
            }
        }
    
}

私の目標は単純です。ユーザーが終了すると入力します。

そのまま表示します

終了コマンドが見つかりました

終了しています...

そして、これら 3 つのドットのそれぞれの間には 1 秒の遅延があります。

しかし、私が得る出力は

終了コマンドが見つかりました

終了します。他のもの ..

ただし、親プロセスが戻り、呼び出し元の関数から他のものを実行してから、他の2つのドットを出力し続けるようです。親プロセスがそれをしないようにするにはどうすればよいですか?

4

1 に答える 1

0

次のように waitpid() を使用します。

pid_t childPid;  
childPid = fork();
...
int returnStatus;    
waitpid(childPid, &returnStatus, 0);  // Parent process waits here for child to terminate.

ここで使う

if(childPid == 0)  // fork succeeded 
{   
   // Do something   
   exit(0); 
}
else  // Main (parent) process after fork succeeds 
{    
    int returnStatus;    
    waitpid(childPid, &returnStatus, 0);
}
于 2016-02-07T17:05:16.143 に答える