首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >信号量仿真程序:故障分割误差

信号量仿真程序:故障分割误差
EN

Stack Overflow用户
提问于 2016-04-25 14:27:38
回答 2查看 226关注 0票数 2

我编写了下面的程序,它模拟信号量的工作。有三个功能:锁定、解锁、锁定路径。

lock =打开文件;检查文件是否已经存在,如果存在,则将当前进程置于休眠状态。如果该文件不存在,则创建该文件并返回TRUE。

解锁=删除文件

lockpath =返回与可能创建的文件对应的路径名。

下面是源代码:

代码语言:javascript
复制
    #include <unistd.h>

//exit();
#include <stdlib.h>

//errno
#include <errno.h>

//creat(..)
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

//strcat, strcpy
#include <string.h>

//For err_sys
#include <stdio.h>

#define LOCKDIR "/tmp/"
#define MAXTRY 3
#define WAITTIME 5

enum BOOLEAN{TRUE, FALSE};

void err_sys(const char* x) {
  perror(x);
  exit(1);
}

static char* lockpath(char* name) {
  static char path[20];
  strcpy(path, LOCKDIR);
  return (strcat(path, name));
}

int lock(char* name) {
  char *path;
  int fd, incerc;
  extern int errno;
  path = lockpath(name);
  int try = 0;

  while ((fd = open(path, O_WRONLY | O_CREAT | O_EXCL, 0666)) < 0 
          && errno == EEXIST) {
    if (++try >= MAXTRY)
        return FALSE;
    sleep(WAITTIME);  
  }

  if (fd < 0 || close(fd) < 0)
    err_sys("lock");

  return TRUE;
}

void unlock(char* name) {
  if (unlink(lockpath(name)) < 0)
    err_sys("unlock");
}


int main(void) {

  pid_t child_process;

  child_process = fork();

  char* sem_file_name = "test_semaf";

  if (child_process != 0)
  {
    printf("\nParent process ID: %d", getpid());
  }
  else 
  { 
    printf("\nChild process ID: %d", getpid());
  }

  if (lock(sem_file_name))
  {
      printf("\nProcess with ID: %d", getpid());
      printf("\nonly, has access to %s", strcat(LOCKDIR, sem_file_name)); //****
      unlock(sem_file_name);
  } else {
    printf("\nProcess with ID: %d", getpid());
    printf("\nwas unable to get access to %s", strcat(LOCKDIR, sem_file_name));
  }

  return 0;
}

程序停止的行标记为:*

错误是:

程序接收信号SIGSEGV,分割故障。在../sysdeps/x86_64/multiarch/strcat-ssse3.S:571 571 ../sysdeps/x86_64/ __strcat_ssse3 /strcat-Sse3.S:没有这样的文件或目录。

问题是我得到了分段错误,却找不到问题在哪里。对我来说一切都很好。进程应该创建文件X。那么,如果另一个进程试图创建自己的文件X,则不允许该进程进入休眠状态。第二个过程允许进行MAXTRY尝试。如果在MAXTRY尝试之后它没有成功,那么lock()函数将返回FALSE。最后,当已经成功创建自己的X文件的进程现在不需要它时,文件X就会被删除。

你能告诉我这个节目有什么问题吗?提前谢谢你。

编辑:下面是指向页面的链接,它解释了为什么lockpath()函数不正确。

返回指向静态局部变量的指针是否安全?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-25 14:41:49

这就是你撞车的原因:

代码语言:javascript
复制
strcat(LOCKDIR, sem_file_name)

在这里,您尝试附加到一个文字字符串常量。

您也应该在这里使用lockpath函数。

票数 3
EN

Stack Overflow用户

发布于 2016-04-25 14:51:53

问题似乎在于你对strcat()函数的误解。函数将第二个参数中的字符串附加到第一个参数-中的字符串,但您需要确保数据有足够的空间。读手册页

这意味着

代码语言:javascript
复制
char * dest = "whatever";
strcat(dest, anything_else);

总是错的。你想要的是

代码语言:javascript
复制
char dest[SIZE] = "whatever";
strcat(dest, anything_else);

其中,SIZE足够大,使缓冲区能够包含整个级联字符串。

另外,您的lockpath()函数也被破坏了。请参阅这个答案了解原因。您需要在lockpath()函数之外创建dest缓冲区,并将其作为参数传递给它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36843464

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档