unix / cleanup unix socket只有在仍由进程拥有的情况下才能解除链接

时间:2016-02-25 15:44:07

标签: c linux unix-socket

首次使用Unix域套接字,现在我正在尝试实现清理部分。

在创建侦听套接字时,一般建议首先尝试取消链接所需的套接字路径,然后调用bind,这似乎有点难看。虽然你可能应该确保你的进程只运行一次,但我正在尝试为某些情况做准备,因为它会被启动两次。对于服务本身而言并不重要:第一个实例的套接字被第二个实例取消链接,因此它无法访问,浪费了一些RAM,但没有造成任何伤害。但是,如何实现在这种情况下工作的清理?只是做

close(sockFd);
unlink(sockPath);

会导致这样的情况:如果第一个进程在第二个进程仍在运行时退出,它实际上会从文件系统中删除第二个进程'套接字。热潮,没有服务。

我只能想到一些不是原子的丑陋黑客,所以仍然可能搞砸了,所以我希望有一个更好的范例来防止在这种情况下结束。像funlink(sockFd)这样的东西本来不错。否则,我不得不求助于从不清理插座,这不是世界末日,但对我来说感觉很麻烦。

抽象域套接字看起来非常有前途(尽管它现在会把我绑定到Linux),但不幸的是它们似乎不支持权限,这在我的情况下是必需的。

1 个答案:

答案 0 :(得分:1)

在使用套接字执行任何操作之前,您可以使用应用程序与flock()锁定的单独锁定文件。只要所有应用程序实例都同意使用哪个锁定文件,您就是安全的,并且flock()是原子的。清除对 <ul class="nav nav-tabs"> <li role="presentation" class="active"><a href="/account.php">Home</a></li> <li role="presentation"><a href="#">1</a></li> <li role="presentation"><a href="#">2</a></li> <li role="presentation"><a href="#">3</a></li> <li role="presentation"><a href="#">4</a></li> <li role="presentation"><a href="#">5</a></li> <li role="presentation"><a href="#">6</a></li> <!--This is the one that i need aligned to the right --> <li role="presentation" class="pull-right"><a href="#">Admin Panel</a></li> 没有问题,因为当进程终止时释放锁。