SIGSEGV使用叉运行geant4

问题描述:

我运行我的代码,它使用fork来创建一个孩子Geant4过程,但只有当我使用一个函数时遇到问题。我可以连续多次调用我的函数而没有问题,所以我认为问题必须发生在主要终止之前,因此我关心的所有事情都已成功完成。我认为即使不影响结果,忽略错误也不是好的编程习惯,所以我想知道是什么导致了错误。
这是我的代码没有功能(无SIGSEGV):SIGSEGV使用叉运行geant4

#include <iostream> 

#include <unistd.h> 
#include <string> 
#include <cstring> 
#include <stdio.h> 
#include <stdlib.h> 
#include <sys/wait.h> 

int main() 
{ 
    using namespace std; 

string runFile; 
cout << "Enter run macro file name: "; 
cin >> runFile; 
cout << "Running './disk " << runFile << "'" << endl; 
const char* file = runFile.c_str(); 

const char* programPath = 
     "/home/fred/Documents/DIRC_Research/disk-build/disk"; 

    pid_t pid = fork(); 

    switch (pid) 
    { 
     case -1: 
      std::cerr << "fork() failed.\n"; 
      exit(1); 
     case 0: 
      execl(programPath, "disk", file, NULL); 
      std::cerr << "execl() failed!"; 
      exit(1); 
     default: 
      std::cout << "Process created with pid " << pid << std::endl; 
      int* status; 

      waitpid(pid, status, 0); 

      std::cout << "Process exited with " << WEXITSTATUS(status) << std::endl; 
    } 
} 

这是使用功能

#include <iostream> 

#include <unistd.h> 
#include <string> 
#include <cstring> 
#include <stdio.h> 
#include <stdlib.h> 
#include <sys/wait.h> 

void runDisk(const char*); 

int main() 
{ 
    using namespace std; 

    string runFile; 
    cout << "Enter run macro file name: "; 
    cin >> runFile; 
    cout << "Running './disk " << runFile << "'" << endl; 
    const char* file = runFile.c_str(); 
    runDisk(file); 

    return 0; 
} 

// Function to run disk Geant4 simulation with a run macro file 
void runDisk(const char* runFile) 
{ 
    const char* programPath = 
     "/home/fred/Documents/DIRC_Research/disk-build/disk"; 

    pid_t pid = fork(); 

    switch (pid) 
    { 
     case -1: 
      std::cerr << "fork() failed.\n"; 
      exit(1); 
     case 0: 
      execl(programPath, "disk", runFile, NULL); 
      std::cerr << "execl() failed!"; 
      exit(1); 
     default: 
      std::cout << "Process created with pid " << pid << std::endl; 
      int* status; 

      waitpid(pid, status, 0); 

      std::cout << "Process exited with " << WEXITSTATUS(status) << std::endl; 
    } 
} 

它使用一个函数的代码,它提供了SIGSEGV终止之前,即使我做函数内联。我真的很想知道发生了什么。

我想我已经弄清楚了,至少就功能使用情况而言。我已经把

int status = 0; 

waitpid(pid, &status, 0); 

std::cout << "Process exited with " << WEXITSTATUS(status) << std::endl; 

而不是

现在我不再感到困扰SIGSEGV。至于它不工作的原因对我来说仍然是一个谜,也许它与删除status的功能有关。