Eu não acho que o systemd possa ler um arquivo que está bloqueado. Tente algo assim:
void unlockfile() {
struct flock fl;
fl.l_type = F_UNLCK;
/* etc. */
return fcntl(fd, F_SETLK, &fl);
}
Como o pastebin tem anúncios faladores desagradáveis, aqui está o código fonte inteiro do pôster original:
#define _BSD_SOURCE
#define _GNU_SOURCE
#define _POSIX_C_SOURCE 199506L
#define _D_XOPEN_SOURCE 700
#define NAME "lab1_daemon"
#define PID_FILE_NAME "/run/" NAME ".pid"
#include <errno.h>
#include <fcntl.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <syslog.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
int lockfile(int fd)
{
struct flock fl;
fl.l_type = F_WRLCK;
fl.l_start = 0;
fl.l_whence = SEEK_SET;
fl.l_len = 0;
return fcntl(fd, F_SETLK, &fl);
}
bool is_already_running(char const *lock_file_name)
{
int lock_file = open(lock_file_name, O_RDWR | O_CREAT,
S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
if (lock_file < 0)
exit(1);
if (lockfile(lock_file) < 0) {
if (errno == EACCES || errno == EAGAIN) {
close(lock_file);
return true;
}
exit(1);
}
ftruncate(lock_file, 0);
char buf[16];
sprintf(buf, "PPID: %ld\n", (long)getpid());
write(lock_file, buf, strlen(buf) + 1);
return false;
}
int main(void)
{
if (is_already_running(PID_FILE_NAME))
exit(EXIT_FAILURE);
daemon(0, 0);
sleep(10);
exit(EXIT_SUCCESS);
}