LINUX.ORG.RU

Сообщения Qwertyr

 

Segmentation fault core dumped

Форум — Development

Здравствуйте, есть задание: First получает со стандартного потока информацию о файлах каталога, и, во-первых, выводит на экран (в консоль) строки о тех из них, у которых установлен бит запуска владельцем; во-вторых, при помощи FIFO передает размер каждого из таких файлов second’у, который суммирует значения и выводит полученное значение на экран. Проблема в том, что при чтении файла в second.c возникает переполнение. first.c:

#ifndef _FILE_OFFSET_BITS
    #define _FILE_OFFSET_BITS 64
#endif
#include <sys/stat.h>
#include <dirent.h>
#include <errno.h>
#include <fcntl.h>
#include <inttypes.h>
#include <limits.h>
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

uint64_t total_size_files(char *path){
    char buf[PATH_MAX + 1], buf1[PATH_MAX + 1];
    struct stat file_stats;
    DIR *dirp;
    struct dirent* dent;
    uint64_t sum = 0;
    dirp = opendir(path);
    if(!dirp){
        perror("opendir()");
        return -1;
    }
    do{
        dent = readdir(dirp);
        if(dent > 0){
            printf("%s - ", dent->d_name);
            snprintf(buf1, PATH_MAX, "%s/%s", path, dent->d_name);
            if(!realpath(buf1, buf)){
                printf("realpath(): %s", strerror(errno));
                continue;
            }
            if(!stat(buf, &file_stats)){
                printf("%" PRIu64 " bytes\n", (uint64_t)file_stats.st_size);
                sum += file_stats.st_size;
            }else{
                printf("stat(): %s\n", strerror(errno));
            }
        }else if(dent < 0){
            printf("readdir(): %s", strerror(errno));
        }
    }while(dent);
    closedir(dirp);
    printf("Size of %ld is %" PRIu64 " bytes\n", sum);
    return sum;
}

int main(){
    char *path = ".";
    //printf("Size of %ld is %" PRIu64 " bytes\n", path, total_size_files(path));
    int fd, result;
    uint64_t size;
    char resstring[1000000];
    char name[]="MYFIFO.fifo";
    (void)umask(0);
    if(mknod(name, S_IFIFO | 0666, 0) < 0){
        printf("Can\'t create FIFO\n");
        exit(-1);
    }
    if((result = fork()) < 0){
        printf("Can\'t fork child\n");
        exit(-1);
    } else if (result > 0) {
        if((fd = open(name, O_WRONLY)) < 0){
            printf("Can\'t open FIFO for writing\n");
            exit(-1);
        }
        size = write(fd, total_size_files(path), sizeof(uint64_t));
        close(fd);
        printf("Parent exit\n");
        close(fd);
    }
    return 0;
}
[\code=C]


second.c:


#ifndef _FILE_OFFSET_BITS
    #define _FILE_OFFSET_BITS 64
#endif
#include <sys/stat.h>
#include <dirent.h>
#include <errno.h>
#include <fcntl.h>
#include <inttypes.h>
#include <limits.h>
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int main(){
    int fd, result;
    size_t size;
    char name[]="MYFIFO.fifo";
 if((fd = open(name, O_RDONLY)) < 0){
        printf("Can\'t open FIFO for reading\n");
        exit(-1);
    }
        size = read(fd, &result, sizeof(uint64_t));
        if(size < 0){
            printf("Can\'t read string\n");
            exit(-1);
        }
    /* Печатаем прочитанную строку */
    printf("%ld\n",size);
    /* Закрываем входной поток и завершаем работу */
    close(fd);
    return 0;
}

[\code=C]

 , , ,

Qwertyr
()

RSS подписка на новые темы