簡體   English   中英

信號量仿真程序:分段錯誤

[英]Semaphore simulation program: Segmentation Fault error

我編寫了以下程序,該程序模擬了信號量的工作。 有三個功能:鎖定,解鎖,鎖定路徑。

lock =打開文件; 檢查文件是否已經存在,如果存在,則將當前進程置於睡眠狀態。 如果文件不存在,則會創建該文件並返回TRUE。

unlock =刪除文件

lockpath =返回與可能創建的文件相對應的路徑名。

這是源代碼:

    #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,分段故障。 __strcat_ssse3()位於../sysdeps/x86_64/multiarch/strcat-ssse3.S:571 571 ../sysdeps/x86_64/multiarch/strcat-ssse3.S:沒有此類文件或目錄。

問題是我遇到了細分錯誤,無法找到問題所在。 對我來說,一切都很好。 應該假定一個進程創建文件X。然后,如果另一個進程試圖創建它自己的文件X,則不允許該文件; 該過程進入睡眠狀態。 第二個過程允許進行MAXTRY嘗試。 如果嘗試MAXTRY后未成功,則lock()函數將返回FALSE。 最后,當已經成功創建自己的X文件的進程現在不需要它時,文件X被刪除。

請問您認為該程序有什么問題嗎? 先感謝您。


編輯:這是指向頁面的鏈接,該頁面解釋了為什么lockpath()函數不正確。

返回指向靜態局部變量的指針安全嗎?

這是導致崩潰的原因:

strcat(LOCKDIR, sem_file_name)

在這里,您嘗試附加到文字字符串常量。

您也應該在這里使用lockpath函數。

問題似乎出在您對strcat()函數的誤解。 該函數將第二個參數中的字符串追加到第一個參數中的字符串- 但是您需要確保有足夠的空間容納數據 閱讀手冊頁

那意味着

char * dest = "whatever";
strcat(dest, anything_else);

總是錯的。 你想要的是

char dest[SIZE] = "whatever";
strcat(dest, anything_else);

SIZE足夠大,緩沖區可以包含整個串聯的字符串。

另外,您的lockpath()函數已損壞。 查看此答案以了解原因。 您需要在lockpath()函數外部創建dest緩沖區,並將其作為參數傳遞給它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM