Почему я получаю ошибку сегмента в Ubuntu, но не в Mac? - PullRequest
0 голосов
/ 31 марта 2011

У меня есть программа, которая проверяет время изменения файла и выполняет файл, если он изменился. В настоящее время он работает, если я запускаю его на своем Mac, но он вызывает ошибки, если я запускаю его на Ubuntu. Пожалуйста, помогите мне.

примечание: это в c

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <signal.h>
#include <errno.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#define CONTERROR(cond, statement) \
   if (cond) { \
      perror(statement); \
      continue; \
   }
#define FATALERROR(cond, statement) \
   if (cond) { \
      perror(statement); \
      exit(EXIT_FAILURE); \
   }

/**
 * Handler for the signals.
 */
static void handler(int signum) {
   ;
}

/**
 * Main.
 */
int main(int argc, char *argv[]) {
   struct sigaction sa;
   struct stat buf;
   struct itimerval tb;
   pid_t pid;
   int modTime;

   if (argc != 2) {
      fprintf(stderr, "usage: remote file\n");
      exit(EXIT_FAILURE);
   }

   FATALERROR(stat(argv[1], &buf) == -1, "stat");
   modTime = buf.st_mtime;

   tb.it_interval.tv_sec = 0;
   tb.it_interval.tv_usec = 50000;
   tb.it_value.tv_sec = 0;
   tb.it_value.tv_usec = 50000;

   setitimer(ITIMER_REAL, &tb, 0);

   sa.sa_handler = handler;
   FATALERROR(sigemptyset(&sa.sa_mask) == -1, "mask");
   FATALERROR(sigaction(SIGALRM, &sa, NULL) == -1, "sigaction");

   while (1) {
      pause();
      CONTERROR(stat(argv[1], &buf) == -1, "stat");
      if (modTime != buf.st_mtime) {
         modTime = buf.st_mtime;
         pid = fork();
         FATALERROR(pid == -1, "fork");
         if (!pid) {
            execlp("rexec", "rexec", NULL);
            fprintf(stderr, "exec\n");
         }
      }
   }
   exit(EXIT_SUCCESS);
}

1 Ответ

1 голос
/ 31 марта 2011

Большая часть вашей структуры sigaction не инициализирована, поэтому может содержать случайные данные. Если sa_flags.SA_SIGINFO случайно установлен в этих неинициализированных данных, то сигнал вызовет sa_sigaction вместо sa_handler, который также неинициализирован, поэтому почти наверняка произойдет сбой.

Возможно, вам будет легче отлаживать, если вы инициализируете все поля, в том числе убедитесь, что вы установили флаги таким образом, чтобы сигналы работали так, как вы хотите.

...