ZBLOG

sem_init:semget error:File exists

这个错误信息通常表示在尝试使用 semget 创建一个新的信号量时,指定的键值(key)已经存在。根据您提供的代码,问题可能是因为您多次运行了该程序,而每次运行时都尝试以相同的键值创建信号量。

解决方法:

  1. 清除已存在的信号量

    • 您可以在运行程序之前手动删除已有的信号量。例如,可以使用 ipcrm 命令来删除共享内存或信号量。具体命令如下:
      
      ipcrm -s <semid>
      
    • 如果不确定 semid,可以列出所有信号量并找到对应项:
      
      ipcs -s
      
  2. 更改键值生成逻辑

    • 更改键值生成逻辑,以确保每次运行时生成唯一的键值。这可以通过使用当前时间戳或进程ID等方式实现。例如:
      
      key = ftok(".", getpid());
      
  3. 检查是否正确删除信号量

    • 确保在程序结束时调用了 sem_rmv(semid) 函数,以便在退出时自动删除已创建的信号量。这将避免下次运行时出现“File exists”错误。
  4. 添加错误处理机制

    • 在初始化信号量和其他系统调用后添加错误处理,以便能够清楚地知道哪里发生了错误。例如:
      
      semid = sem_init(key);
      if (semid == -1) {
       perror("sem_init");
       exit(EXIT_FAILURE);
      }
      

完整示例更新

以下是包含简单错误处理和唯一键生成逻辑的更新版本:

#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h> 
#include <sys/wait.h>
#include <string.h>
#include "sem_pv.h"

int main(void) { 
    key_t key;
    int pid, fd, semid, n; 
    char str[80];

    // 使用进程ID作为唯一标识符来生成密钥
    key = ftok(".", getpid());

    // 初始化信号量,并添加错误处理
    semid = sem_init(key);
    if (semid == -1) {
        perror("sem_init error");
        exit(EXIT_FAILURE);
    }

    // 打开或创建测试文件,并检查返回值
    fd = open("test.txt", O_RDWR | O_CREAT | O_TRUNC, 0644);
    if (fd == -1) {
        perror("open error");
        exit(EXIT_FAILURE);
    }

    while ((pid = fork()) == -1); 

    if (pid == 0) { // 子进程
        sleep(1);
        
        sem_p(semid);
        lseek(fd, SEEK_SET, 0);
        
        read(fd, str, sizeof(str));
        sem_v(semid);

        printf("child: read str from test file: %s\n", str);
        exit(0);

    } else { // 父进程
        sem_p(semid);
        
        printf("parent: please enter a string for the test file (strlen<80):\n");
        
        fgets(str, sizeof(str), stdin);

        n = strlen(str);

        lseek(fd, SEEK_SET, 0); 
        write(fd, str, n);      
        
        sem_v(semid);

        wait(0);                
        
        close(fd);              
       
       // 删除信号量,确保资源被释放。
       sem_rmv(semid);         
       
       exit(0);
   }
}

总结

这些修改应该能帮助你解决”File exists”的问题。如果问题仍然存在,请确保没有其他程序或残留进程持有该信号量。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://sdn.0voice.com/?id=5611

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?