为什么这条恼人线会干扰我的输出?

时间:2016-02-07 07:03:31

标签: c fork stdout flush fflush

我开发的这段代码只是为了解决我正在开发的另一个大型程序中遇到的问题。

#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);
    printf("Annoying line\n");
}
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);
            }
        }

}

我的目标很简单,当用户进入退出时。

我只会显示

  

发现退出命令

     

退出 ...

这三个点之间有一秒钟的延迟。

然而,我得到的输出是

  

发现退出命令

     

退出。恼人的线..

我想知道为什么这个恼人的线在第一个点之后打印,即使它来自调用函数并且它不是它打印到终端????

任何想法。我花了10个小时试图修复这个

1 个答案:

答案 0 :(得分:1)

在子进程中,您// do nothing会失败并返回main()并打印该行。 fork()制作两份副本,两份副本都继续执行。通常孩子会立即调用exec()来运行其他东西(永不返回),但你没有做那样的事情。