LINUX.ORG.RU

NULL передай, там передается указатель на атрибуты мьютекса, с NULL получатся атрибуты по умолчанию.

man pthread_mutex_init

quest ★★★★
()
Ответ на: комментарий от quest

офффф.... манился я оооочень долго, но так и не понял аргумент NULL это дефолтное значение в pthread_mutex_init, а какое значение аргумент принимает для глобального мьютекса?

sadavod
() автор топика

в юниксах нет именованных мутексов. если нужен просто контроль запуска одного экземпляра приложения, можно сделать что-то такое:

#define _POSIX_C_SOURCE  1

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <signal.h>
#include <string.h>
#include <errno.h>

#define PIDFILE "/tmp/51d4537c-dd72-4a8c-a64e-829189c9397b.pid"


static int my_lock(void) {
        char buf[32], *p;
        pid_t pid;
        ssize_t size;
        int fd = open(PIDFILE, O_CREAT | O_EXCL | O_WRONLY, 0666);
        if (fd < 0) {
                fd = open(PIDFILE, O_RDONLY);
                if (fd < 0)
                        return EAGAIN;
                size = read(fd, buf, sizeof buf - 1);
                close(fd);
                if (size < 2)
                        return EIO;
                buf[size] = 0;
                pid = (pid_t) strtol(buf, &p, 10);
                if (!*buf || *p != '\n' || pid <= 0)
                        return EIO;
                if (kill(pid, 0) < 0) {
                        unlink(PIDFILE);
                        return EAGAIN;
                }
                return EBUSY;
        }

        pid = (long) getpid();
        *(p = &buf[sizeof buf - 1]) = '\n';
        do (*--p = '0' + pid % 10), pid /= 10; while (pid);
        size = write(fd, p, &buf[sizeof buf] - p);
        if (close(fd) < 0 || size != &buf[sizeof buf] - p) {
                unlink(PIDFILE);
                return EIO;
        }
        return 0;
}

int main() {
        int cnt = 10, retval;
        do retval = my_lock(); while (retval == EAGAIN && cnt-- > 0);
        if (retval) {
                printf("failure: %s\n", strerror(retval));
                return EXIT_FAILURE;
        }
        printf("success!\n");
        sleep(5);
        unlink(PIDFILE);
        return EXIT_SUCCESS;
}

правда, этот код ещё допиливать, но идея примерно такая.

arsi ★★★★★
()
Ответ на: комментарий от arsi

> да, но менее эффективно :)

Аха, создание pid-файла - это очевидный ботлнек любого приложения. 8))

kemm
()
Ответ на: комментарий от true_admin

Если речь о десктопе, то dbus там уже будет.

k_andy ★★★
()
Ответ на: комментарий от ananas

не сочтите за наглость а через семафоры решить можно такое? Спасибо, и ещё раз не сочтите за наглость, просто у меня опыта ну Очень мало

sadavod
() автор топика
Ответ на: комментарий от sadavod

Можно и через семафоры. Только вышеупомянутая libunique позволяет ещё и сообщения посылать. Например, второй экземпляр программы запущен с параметрами, их можно передать в первый экземпляр и завершиться.

k_andy ★★★
()
Ответ на: комментарий от sadavod

нельзя. семафоры не удаляются при аварийном завершении программы, к тому-же, при подобном их использовании возможна гонка.

еще раз - почитайте стивенса «взаимодействие процессов», там все эти моменты довольно детально описаны

ananas ★★★★★
()
Ответ на: комментарий от ananas

>еще раз - почитайте стивенса «взаимодействие процессов», там все эти моменты довольно детально описаны

Трудно поспорить с преимуществом, что PID файл спасёт в случае если программа свалится, спасибо.

ПС где в системе должен быть unpipc.h ? Я ослеп?

sadavod
() автор топика

У себя проверку запущено приложение или нет я делал через расшаренную память, в которую писал пид процесса. Если память расшарена, то происходит поиск приложения по пиду (что позволяет определить, живо ли приложение). Работает и в линуксе, и в винде, и в макоси.

andreyu ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.