2012-03-14 93 views
1

嗨我正在Linux上工作,我正在尝试创建一个GUI应用程序,以使用我制作的可执行文件。Qt GUI应用程序意外结束

由于某种原因,它意外地结束。没有错误消息,它只是说在Qt控制台窗口意外结束退出代码0.

有人可以请看看它对我来说。我正在研究Linux。

我也会在这里粘贴代码。

void MainWindow::on_pushButton_clicked() 
{ 
    QString stringURL = ui->lineEdit->text(); 

    ui->labelError->clear(); 
    if(stringURL.isEmpty() || stringURL.isNull()) { 
     ui->labelError->setText("You have not entered a URL."); 
     stringURL.clear(); 
     return; 
    } 

    std::string cppString = stringURL.toStdString(); 
    const char* cString = cppString.c_str(); 

    char* output; 

    //These arrays will hold the file id of each end of two pipes 
    int fidOut[2]; 
    int fidIn[2]; 

    //Create two uni-directional pipes 
    int p1 = pipe(fidOut);    //populates the array fidOut with read/write fid 
    int p2 = pipe(fidIn);     //populates the array fidIn with read/write fid 
    if ((p1 == -1) || (p2 == -1)) { 
     printf("Error\n"); 
     return; 
    } 

    //To make this more readable - I'm going to copy each fileid 
    //into a semantically more meaningful name 
    int parentRead = fidIn[0]; 
    int parentWrite = fidOut[1]; 
    int childRead = fidOut[0]; 
    int childWrite = fidIn[1]; 

    ////////////////////////// 
    //Fork into two processes/ 
    ////////////////////////// 
    pid_t processId = fork(); 

    //Which process am I? 
    if (processId == 0) { 
     ///////////////////////////////////////////////// 
     //CHILD PROCESS - inherits file id's from parent/ 
     ///////////////////////////////////////////////// 
     ::close(parentRead);  //Don't need these 
     ::close(parentWrite);  // 

     //Map stdin and stdout to pipes 
     dup2(childRead, STDIN_FILENO); 
     dup2(childWrite, STDOUT_FILENO); 

     //Exec - turn child into sort (and inherit file id's) 
     execlp("htmlstrip", "htmlstrip", "-n", NULL); 

    } else { 
     ///////////////// 
     //PARENT PROCESS/ 
     ///////////////// 
     ::close(childRead);  //Don't need this 
     ::close(childWrite);  // 

     //Write data to child process 
     //char strMessage[] = cString; 
     write(parentWrite, cString, strlen(cString)); 
     ::close(parentWrite);  //this will send an EOF and prompt sort to run 

     //Read data back from child 
     char charIn; 
     while (read(parentRead, &charIn, 1) > 0) { 
      output = output + (charIn); 
      printf("%s", output); 
     } 
     ::close(parentRead);  //This will prompt the child process to quit 
    } 

    return; 
} 

编辑::调试结果

我跑调试器,这是我收到的错误:

The inferior stopped because it received a signal from the Operating System. 

Signal name : SIGSEGV 
Signal meaning : Segmentation fault 
+0

您是否尝试过在调试器中运行呢?它可以帮助你发现什么是错的,最重要的是,它是错的。 – 2012-03-14 11:30:40

+0

除了找到原因(信号)之外,您应该能够让调试器在该点中断执行并查看违规行。基本的调试技巧。 – Macke 2012-03-14 12:16:47

+0

你想在这种情况下粘贴什么是'bt'(backtrace) – 2012-03-14 12:47:16

回答

5

您还没有初始化的“输出”变量。在你的代码的最后几行,你这样做:

while (read(parentRead, &charIn, 1) > 0) { 
    output = output + (charIn); 
    printf("%s", output); 
} 

这将做坏事,因为你添加自己的子进程读一个字节,到输出变量,它是一个包含垃圾的指针,然后将字符串“output”变量地址的内容打印出来。你可能想“输出”是一个std::string,这样,你的代码可能意义:

std::string output; 
/* ... */ 
while (read(parentRead, &charIn, 1) > 0) { 
    output += (charIn); 
} 
std::cout << output; 

一旦您已经阅读所有的子进程产生的数据,你可以将它写入stdout。

编辑:既然要“输出”的内容设置为QPlainTextEdit,你可以使用QPlainTextEdit :: setPlainText:

while (read(parentRead, &charIn, 1) > 0) { 
    output += (charIn); 
} 
plainTextEdit.setPlainText(output.c_str()); 
+0

的输出嗨,谢谢你的回答。我现在没有遇到错误。但是你知道我将如何获得打印到plainTextEdit的输出吗? – user667430 2012-03-14 12:03:23

+1

我已经编辑了我的答案,现在检查它。 – mfontanini 2012-03-14 12:08:08

+0

谢谢你的工作 – user667430 2012-03-14 12:46:46