136QLockFile::LockError QLockFilePrivate::tryLock_sys()
138 const QByteArray lockFileName = QFile::encodeName(fileName);
139 const int fd = qt_safe_open(lockFileName.constData(), O_RDWR | O_CREAT | O_EXCL, 0666);
143 return QLockFile::LockFailedError;
146 return QLockFile::PermissionError;
148 return QLockFile::UnknownError;
152 if (!setNativeLocks(fd)) {
153 const int errnoSaved = errno;
154 qWarning() <<
"setNativeLocks failed:" << qt_error_string(errnoSaved);
157 QByteArray fileData = lockFileContents();
158 if (qt_write_loop(fd, fileData.constData(), fileData.size()) < fileData.size()) {
160 if (unlink(lockFileName) != 0)
161 qWarning(
"QLockFile: Could not remove our own lock file %s: %ls.",
162 lockFileName.constBegin(), qUtf16Printable(qt_error_string()));
163 return QLockFile::UnknownError;
170#if defined(_POSIX_SYNCHRONIZED_IO
) && _POSIX_SYNCHRONIZED_IO
> 0
171 fdatasync(fileHandle);
176 return QLockFile::NoError;
179bool QLockFilePrivate::removeStaleLock()
181 const QByteArray lockFileName = QFile::encodeName(fileName);
182 const int fd = qt_safe_open(lockFileName.constData(), O_WRONLY, 0666);
185 bool success = setNativeLocks(fd) && (::unlink(lockFileName) == 0);
190bool QLockFilePrivate::isProcessRunning(qint64 pid,
const QString &appname)
192 if (::kill(pid_t(pid), 0) == -1 && errno == ESRCH)
195 const QString processName = processNameByPid(pid);
196 if (!processName.isEmpty()) {
197 QFileInfo fi(appname);
199 fi.setFile(fi.symLinkTarget());
200 if (processName != fi.fileName())
207QString QLockFilePrivate::processNameByPid(qint64 pid)
209#if defined(Q_OS_MACOS)
211 proc_name(pid, name,
sizeof(name) /
sizeof(
char));
212 return QFile::decodeName(name);
213#elif defined(Q_OS_OHOS)
221 return pid == ::getpid() ? qAppName() : QString();
222#elif defined(Q_OS_LINUX)
223 if (!qt_haveLinuxProcfs())
227 sprintf(exePath,
"/proc/%lld/exe", pid);
229 QByteArray buf = qt_readlink(exePath);
232 return QStringLiteral(
"/ERROR/");
236 static const char deleted[] =
" (deleted)";
237 if (buf.endsWith(deleted))
238 buf.chop(strlen(deleted));
240 return QFileSystemEntry(buf, QFileSystemEntry::FromNativePath()).fileName();
241#elif defined(Q_OS_HAIKU)
243 if (get_thread_info(pid, &info) != B_OK)
245 return QFile::decodeName(info.name);
246#elif defined(Q_OS_BSD4) && !defined(QT_PLATFORM_UIKIT)
247# if defined(Q_OS_NETBSD)
248 struct kinfo_proc2 kp;
249 int mib[6] = { CTL_KERN, KERN_PROC2, KERN_PROC_PID, (
int)pid,
sizeof(
struct kinfo_proc2), 1 };
250# elif defined(Q_OS_OPENBSD)
251 struct kinfo_proc kp;
252 int mib[6] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, (
int)pid,
sizeof(
struct kinfo_proc), 1 };
254 struct kinfo_proc kp;
255 int mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, (
int)pid };
257 size_t len =
sizeof(kp);
258 u_int mib_len =
sizeof(mib)/
sizeof(u_int);
260 if (sysctl(mib, mib_len, &kp, &len, NULL, 0) < 0)
263# if defined(Q_OS_OPENBSD) || defined(Q_OS_NETBSD)
266 QString name = QFile::decodeName(kp.p_comm);
268 if (kp.ki_pid != pid)
270 QString name = QFile::decodeName(kp.ki_comm);
273#elif defined(Q_OS_QNX)
274 char exePath[PATH_MAX];
275 sprintf(exePath,
"/proc/%lld/exefile", pid);
277 int fd = qt_safe_open(exePath, O_RDONLY);
282 if (QT_FSTAT(fd, &sbuf) == -1) {
287 QByteArray buffer(sbuf.st_size, Qt::Uninitialized);
288 buffer.resize(qt_safe_read(fd, buffer.data(), sbuf.st_size - 1));
289 if (buffer.isEmpty()) {
291 return QStringLiteral(
"/ERROR/");
293 return QFileSystemEntry(buffer, QFileSystemEntry::FromNativePath()).fileName();
305void QLockFile::unlock()
311 const QByteArray lockFileName = QFile::encodeName(d->fileName);
312 if (unlink(lockFileName) != 0) {
313 qWarning(
"Could not remove our own lock file %s: %ls (maybe permissions changed meanwhile?)",
314 lockFileName.constBegin(), qUtf16Printable(qt_error_string()));
318 close(d->fileHandle);
320 d->lockError = QLockFile::NoError;