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
的功能有关。