Здравствуйте, есть задание: 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]