【问题标题】:Why is this Annoying Line interfering with my output?为什么这条烦人的线路会干扰我的输出?
【发布时间】:2016-05-16 23:58:36
【问题描述】:

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

#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 个小时试图解决这个问题

【问题讨论】:

  • 我认为父进程在分叉后仍在继续并打印该行。孩子已经很好地终止了......请注意,烦人的线出现在第一个点之后,然后孩子睡觉,父母获得 CPU 时间,返回并打印。
  • @PaulOgilvie,那么我将如何解决这个问题?
  • 不要打印Annoying Line。无论如何,您想解决什么问题?这是正确的代码。
  • 在我的原始代码中,我调用processLine函数后必须继续打印,我只是为了解决这个问题而编写了这段代码
  • 但是有什么问题呢?你打印了一行,现在抱怨它打印了一行?严重地?也许是您对fork() 所做的事情的理解存在缺陷。也许回到那个代码是错误的?

标签: c fork stdout flush fflush


【解决方案1】:

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

【讨论】:

  • 我该如何解决这个问题?在我原来的程序中,我在子进程中做了很多事情,但仍然发生同样的行为
  • @Pro:在子进程中完成后调用exit()。与避免从父级打印 Annoying line 的方式相同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-19
  • 2011-11-11
  • 2011-03-14
  • 2013-01-07
  • 2011-11-26
  • 2021-01-06
  • 1970-01-01
相关资源
最近更新 更多