Почему, когда я нажимаю CTRL + C, программа читает ноль байтов? (С-Posix) - PullRequest
0 голосов
/ 04 сентября 2018

Моя программа должна сделать это: Пользователь должен передать N абсолютных путей к файлам в командной строке. Затем i-й поток с 0 <= i <= N должен записать в i-й файл строку, переданную пользователем с помощью scanf (или fgets). Если нажать CTRL + C, программа должна распечатать все строки, которые пользователь передал с помощью scanf. </p>

Когда я запускаю это и вставляю строку для 1 из N файлов и нажимаю CTRL + C, в функции onPress функция read возвращает 0 (я думаю, что в этом случае не указывает, что указатель файла находится в конец файла) и печатает только строку «Strings:»

Код:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
#include <string.h>
#include <signal.h>

pthread_mutex_t mutex;
int fdGlobal;

void* writer (int* arg) {
   int fd_in = *(arg);
   char buffer[100];  
   pthread_mutex_lock(&mutex);
   printf("Write the string that you want to insert in the file\n");
   scanf("%s", &buffer);
   write(fd_in, &buffer, strlen(buffer));
   write(fdGlobal, &buffer, strlen(buffer));
   printf("Finished\n");
   pthread_mutex_unlock(&mutex); 
}

void onPress(int sig) {
   char buff[100];
   printf("I'm going to print all strings passed in files...\n");
   int rd = read(fdGlobal, &buff, sizeof(buff));
   if (rd == -1) perror("Error in the read of global file\n");
   printf("I read %d bytes\n", rd);
   printf("Strings: %s\n", buff);
   exit(0);
}

void main (int argc, char* argv[]) {
   int fds[argc-1];
   pthread_t tid[argc-1];
   int i, mu;

   if (argc<=1) {
      printf("Insert a number >=1 of  pathname/s\n");
   }

   for ( i = 1 ; i<argc; i++) {
      if (argv[i][0] != '/') {
        printf("Insert a pathname\n");
       }
   }

   signal(SIGINT, onPress);

   fdGlobal = open("globalFile.txt", O_CREAT|O_RDWR, 0666);
   if (fdGlobal == -1) perror("Error in the open of global file\n"); 

   mu = pthread_mutex_init(&mutex, NULL);
   if (mu < 0) perror("Error in the creation of mutex\n");

   for (i=0; i<argc-1; i++) {
      fds[i] = open(argv[i+1], O_CREAT|O_WRONLY, 0666);
      if (fds[i] < 0 ) perror("Error in the open of the file\n");

      pthread_create ( &tid[i], NULL, (void*) writer, &(fds[i]) );
   }

  for (i=0; i<argc-1; i++) {
      pthread_join(tid[i], NULL);
  }
  }

1 Ответ

0 голосов
/ 04 сентября 2018

В вашем коде есть множество проблем, связанных с асинхронной безопасностью сигналов, размерами буфера и (не) параллелизмом, но наиболее вероятная причина описанного вами симптома:

функция чтения возвращает 0

означает, что ваше убеждение в том, что указатель файла находится не в конце файла, неуместно.

Действительно, read(), возвращающий 0, является положительным индикатором того, что смещение файла в данный момент находится (или находится за) в конце файла. Если файл был создан заново, я не вижу причин думать, что смещение будет где-то еще. Даже если файл уже существует, вам необходимо переместить смещение файла обратно в начало, чтобы прочитать данные, записанные в текущем запуске программы. Вы можете сделать это с помощью соответствующего вызова, например, lseek().

...