On Wed, Jun 15, 2011 at 12:29:00AM +0200, Enrico Forestieri wrote: > On Tue, Jun 14, 2011 at 08:58:08PM +0200, Andre Poenitz wrote: > > On Tue, Jun 14, 2011 at 08:16:49PM +0200, Enrico Forestieri wrote: > > > No, I didn't find anything specific but it is clear that using the QtCore > > > library is not advisable for this task. > > > > > > > PS I can do the recommit to branch, once it's in trunk. > > > > > > I committed the fix at r39049. However, I think that the reversion of > > > r38746 was not necessary given that a patch had been already devised. > > > > I wonder whether it might be possible for you to file > > a proper bug report for that, i.e. some minimal, but > > complete, reproducible example that exhibits that problem > > on bugreports.qt.nokia.com, product "Qt", component > > "core: i/o" (or whatever is close). > > I don't have an account (and don't want to have one), so I cannot report > the bug. Maybe someone with an account could do that.
I guess I could do that. > I attach here a simple test case exhibiting the problem. > > Problem: When setting the environment of QProcess, a script without > a shebang line fails to execute. > > How to reproduce: > 1) Save the myprog perl script and test-env.cpp in the same directory. > 2) Make executable myprog by "chmod 755 myprog". > 3) Compile test-env.cpp without defining SETENV. > 4) Launch the just compiled executable and verify that the the script is > actually executed. > 5) Now compile test-env.cpp by using -DSETENV. > 6) Launch again the executable and verify that it now fails to execute. > > -- > Enrico > eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' && eval 'exec perl -S > $0 $argv:q' > if 0; > > print "it works"; > exit(0); > > #include <QProcess> > #include <QDebug> > #include <QtCore> > > int main() > { > QProcess *proc = new QProcess(); > #ifdef SETENV > proc->setEnvironment(QProcess::systemEnvironment()); > #endif > proc->setProcessChannelMode(QProcess::MergedChannels); > proc->start("./myprog"); > if (proc->waitForFinished()) > qDebug() << "Output:" << proc->readAll(); > else > qDebug() << "Fail:" << proc->errorString(); > proc->close(); > delete proc; > return 0; > } Ok, that would certainly be detailed enough for a bug report. The path with environment ends up in execve(), the other one in execvp(). execve() requires a shebang line or a binary, execvp() is more forgiving. I admit that this is ... underdocumented. The visible difference here seems to be triggered by the "missing" "shebang line" in the script. Is that intentional? Andre'