- fix: if there is a Red Panda C++ process running program, other Red
Panda C++ processes can't run program correctly.
This commit is contained in:
Roy Qu 2022-03-16 20:39:11 +08:00
parent c67e196e72
commit 14d99711f8
5 changed files with 17 additions and 15 deletions

View File

@ -250,8 +250,8 @@ void CompilerManager::run(const QString &filename, const QString &arguments, con
} }
#else #else
QString newArguments; QString newArguments;
QString sharedMemoryId = "/r"+QUuid::createUuid().toString(QUuid::StringFormat::Id128);
if (consoleFlag!=0) { if (consoleFlag!=0) {
QString sharedMemoryId = QUuid::createUuid().toString();
QString consolePauserPath=includeTrailingPathDelimiter(pSettings->dirs().appLibexecDir())+"consolepauser"; QString consolePauserPath=includeTrailingPathDelimiter(pSettings->dirs().appLibexecDir())+"consolepauser";
if (!fileExists(consolePauserPath)) { if (!fileExists(consolePauserPath)) {
QMessageBox::critical(pMainWindow, QMessageBox::critical(pMainWindow,
@ -280,6 +280,7 @@ void CompilerManager::run(const QString &filename, const QString &arguments, con
.arg(localizePath(filename)).arg(arguments); .arg(localizePath(filename)).arg(arguments);
} }
execRunner = new ExecutableRunner(pSettings->environment().terminalPath(),newArguments,workDir); execRunner = new ExecutableRunner(pSettings->environment().terminalPath(),newArguments,workDir);
execRunner->setShareMemoryId(sharedMemoryId);
#endif #endif
execRunner->setStartConsole(true); execRunner->setStartConsole(true);
} else { } else {

View File

@ -156,7 +156,7 @@ void ExecutableRunner::run()
#elif defined(Q_OS_LINUX) #elif defined(Q_OS_LINUX)
int BUF_SIZE=1024; int BUF_SIZE=1024;
char* pBuf=nullptr; char* pBuf=nullptr;
int fd_shm = shm_open("/REDPANDAIDECONSOLEPAUSER20211223",O_RDWR | O_CREAT,S_IRWXU); int fd_shm = shm_open(mShareMemoryId.toLocal8Bit().data(),O_RDWR | O_CREAT,S_IRWXU);
if (fd_shm==-1) { if (fd_shm==-1) {
qDebug()<<QString("shm open failed %1:%2").arg(errno).arg(strerror(errno)); qDebug()<<QString("shm open failed %1:%2").arg(errno).arg(strerror(errno));
} else { } else {
@ -220,7 +220,7 @@ void ExecutableRunner::run()
pBuf = nullptr; pBuf = nullptr;
} }
if (fd_shm!=-1) { if (fd_shm!=-1) {
shm_unlink("/REDPANDAIDECONSOLEPAUSER20211223"); shm_unlink(mShareMemoryId.toLocal8Bit().data());
fd_shm = -1; fd_shm = -1;
} }
#endif #endif
@ -242,7 +242,7 @@ void ExecutableRunner::run()
munmap(pBuf,BUF_SIZE); munmap(pBuf,BUF_SIZE);
} }
if (fd_shm!=-1) { if (fd_shm!=-1) {
shm_unlink("/REDPANDAIDECONSOLEPAUSER20211223"); shm_unlink(mShareMemoryId.toLocal8Bit().data());
} }
#endif #endif
if (errorOccurred) { if (errorOccurred) {

View File

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

@ -54,11 +54,11 @@ vector<string> GetCommand(int argc,char** argv,bool &reInp,bool &pauseAfterExit)
int flags = atoi(argv[1]); int flags = atoi(argv[1]);
reInp = flags & RPF_REDIRECT_INPUT; reInp = flags & RPF_REDIRECT_INPUT;
pauseAfterExit = flags & RPF_PAUSE_CONSOLE; pauseAfterExit = flags & RPF_PAUSE_CONSOLE;
for(int i = 2;i < argc;i++) { for(int i = 3;i < argc;i++) {
//result += string("\"") + string(argv[i]) + string("\""); //result += string("\"") + string(argv[i]) + string("\"");
std::string s(argv[i]); std::string s(argv[i]);
if (i==2 || (reInp && i==3 )) if (i==3 || (reInp && i==4 ))
if (s.length()>2 && s[0]=='\"' && s[s.length()-1]=='\"') { if (s.length()>2 && s[0]=='\"' && s[s.length()-1]=='\"') {
s = s.substr(1,s.length()-2); s = s.substr(1,s.length()-2);
} }
@ -130,17 +130,18 @@ int ExecuteCommand(vector<string>& command,bool reInp) {
} }
int main(int argc, char** argv) { int main(int argc, char** argv) {
char* sharedMemoryId;
// First make sure we aren't going to read nonexistent arrays // First make sure we aren't going to read nonexistent arrays
if(argc < 3) { if(argc < 4) {
printf("\n--------------------------------"); printf("\n--------------------------------");
printf("\nUsage: ConsolePauser.exe <0|1> <filename> <parameters>\n"); printf("\nUsage: ConsolePauser.exe <0|1> <shared_memory_id> <filename> <parameters>\n");
printf("\n 1 means the STDIN is redirected by Red Panda C++; 0 means not\n"); printf("\n 1 means the STDIN is redirected by Red Panda C++; 0 means not\n");
PauseExit(EXIT_SUCCESS,false); PauseExit(EXIT_SUCCESS,false);
} }
// Make us look like the paused program // Make us look like the paused program
//SetConsoleTitleA(argv[2]); //SetConsoleTitleA(argv[3]);
sharedMemoryId = argv[2];
bool reInp; bool reInp;
bool pauseAfterExit; bool pauseAfterExit;
@ -155,18 +156,18 @@ int main(int argc, char** argv) {
int BUF_SIZE=1024; int BUF_SIZE=1024;
char* pBuf=nullptr; char* pBuf=nullptr;
int fd_shm = shm_open("/REDPANDAIDECONSOLEPAUSER20211223",O_RDWR,S_IRWXU); int fd_shm = shm_open(sharedMemoryId,O_RDWR,S_IRWXU);
if (fd_shm==-1) { if (fd_shm==-1) {
//todo: handle error //todo: handle error
printf("shm open failed %d:%s",errno,strerror(errno)); printf("shm open failed %d:%s\n",errno,strerror(errno));
} else { } else {
if (ftruncate(fd_shm,BUF_SIZE)==-1){ if (ftruncate(fd_shm,BUF_SIZE)==-1){
printf("ftruncate failed %d:%s",errno,strerror(errno)); printf("ftruncate failed %d:%s\n",errno,strerror(errno));
//todo: set size error //todo: set size error
} else { } else {
pBuf = (char*)mmap(NULL,BUF_SIZE,PROT_READ | PROT_WRITE, MAP_SHARED, fd_shm,0); pBuf = (char*)mmap(NULL,BUF_SIZE,PROT_READ | PROT_WRITE, MAP_SHARED, fd_shm,0);
if (pBuf == MAP_FAILED) { if (pBuf == MAP_FAILED) {
printf("mmap failed %d:%s",errno,strerror(errno)); printf("mmap failed %d:%s\n",errno,strerror(errno));
pBuf = nullptr; pBuf = nullptr;
} }
} }
@ -189,7 +190,7 @@ int main(int argc, char** argv) {
munmap(pBuf,BUF_SIZE); munmap(pBuf,BUF_SIZE);
} }
if (fd_shm!=-1) { if (fd_shm!=-1) {
shm_unlink("/REDPANDAIDECONSOLEPAUSER20211223"); shm_unlink(sharedMemoryId);
} }
// Done? Print return value of executed program // Done? Print return value of executed program