【问题标题】:Using Semaphores does not work when opening file in tmp folder在 tmp 文件夹中打开文件时使用信号量不起作用
【发布时间】:2018-10-03 07:47:10
【问题描述】:

所以,我正在尝试使用多进程(fork)来处理并发。

我首先在本地文件夹中运行了代码,并且代码运行良好。但是,当我尝试将文件设置到 UNIX 中的 tmp 文件夹时,我的代码不会被信号量阻塞。在我看来,当从 tmp 文件夹打开文件时,每个进程都将完成所有工作,而不是拆分工作,或者在极少数情况下,1 个进程将完成所有工作,而另外两个进程以某种方式永远无法访问锁。

让我发疯,如果它适用于本地文件,那么它没有理由在 tmp 文件夹中失败。

基本目标是我有一组来自fork() 的子进程,只有一个进程控制打开文件、从文件读取值、存储值、关闭文件、修改值、打开文件、写入的 CS值文件,关闭文件,然后结束 CS。我正在使用POSIX semaphore

tmp/file.txt 是否有任何理由与sem_wait()/sem_post() 存在问题。任何指针都会有所帮助。

这两个代码唯一不同的是:

fd = open("Seq.txt", O_RDONLY);

对比

fd = open("tmp/Seq.txt", O_RDONLY);

我需要发布更大的代码 sn-p 吗?

【问题讨论】:

  • 可能 open 找不到 tmp/Seq.txt 文件。是否需要在路径中添加/?像这样fd = open("/tmp/Seq.txt", O_RDONLY);。请提供minimal reproducible example
  • 上帝...当吉特。那个工作。知道这很简单。谢谢。奇怪的是,我认为错误检查会发现这一点。
  • @Leruce open() 调用失败时没有返回负值?
  • 不,跳过它并进入 fd != -1 接下来并写了。

标签: c unix concurrency posix semaphore


【解决方案1】:

您最好知道如何解析路径名,这样您以后就可以避免此类错误。

来自Path resolution的在线参考:

相关摘录:

如果路径名以“/”字符开头,则开始查找 directory 是调用进程的根目录。 (一个过程 从其父目录继承其根目录。通常这将是 文件层次结构的根目录。

如果路径名不以“/”字符开头,则 解析过程的查找目录是当前工作 进程目录。

以“/”字符开头的路径名称为绝对路径名 路径名。不以“/”开头的路径名称为相对路径名 路径名。

您可以浏览整个页面,这将非常有帮助。

如果您想避免使用绝对路径名,因为它的长度,
您也可以考虑使用openat() 而不是open()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 2017-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-06
    相关资源
    最近更新 更多