程序停留在等待()(program stuck on wait())

2019-10-22 01:43发布

我有粘在等待一个过程的问题。 我已经解决此问题,其唯一的缺陷目前,我有我的shell程序。

问题是程序当用户输入“退出”应该退出。 然而,似乎如果用户输入一个无效的字符串程序卡上的等待()。 这导致必须键入exit两次退出,而不是一次。 如何阻止这种情况发生,我怎么从等待退出()调用当用户输入一个字符串哑巴?

重现步骤:

  • 编译并用gcc / g的运行++
  • 输入您选择的脏话
  • 键入exit
  • 注意程序犯规退出(因为它停留在等待(),但提示
  • 再次键入exit
  • 退出程序


#include <iostream>
#include <unistd.h>
#include "stdlib.h"
#include "stdio.h"
#include <iostream>
#include <string>
#include <sys/wait.h>
#include <sstream>
#include <cstring>
#include <sys/types.h>
#include <sys/stat.h>

using std::string;

using std::cout;
using std::endl;


bool exitstatus;
int argsIndex = 0;
pid_t pid;
int main(void)
{  

    char * args[100];
    string check = "";           

    while(exitstatus==false)
    {
        cout<<"tinyshell:~>";
        std::getline(std::cin, check);
        if(check == "exit"){
            exitstatus==true;

        }

        if(exitstatus==false&&check!="cd..")
        {
            pid = fork();
            perror("");
            if (pid < 0) { /* error occurred */
                fprintf(stderr, "Fork Failed");
                //return 1;
            }
            else if (pid == 0 ) { /* child process */
                execvp(args[0],args);
                perror("");
            }
            else if(check!= "&"){/* parent will wait for the child to complete */
                wait(NULL);
                perror("");
                //  cout <<"Child Complete" << endl;
            }
            else
            {
            }
        }
    }
    return 0;
};

Answer 1:

它可能必须做一些与这一行:

exitstatus==true;

你有没有,有没有可能意味着:

existatus = true;

gcc的报告是这样的影踪( -Wall ):

warning: statement has no effect [-Wunused-value]
         exitstatus==true;

这就是说明为什么能够警告是一个很好的做法一个很不错的例子...

还有你的代码更微妙的问题。 你不检查你的结果execvp功能。 所以基本上,如果你在你的shell中输入一些垃圾命令你Exec将失败,但你的孩子进程将继续运行相同的代码与父(循环)。

只需添加一个exit(EXIT_FAILURE); 你的后execvp()调用。



文章来源: program stuck on wait()