У меня есть файловая система ext4 на моей машине, я создал в нем файл 10 ГБ с помощью команды DD. < /p>
# dd if=/dev/zero of=/root/ext4fs/afile bs=1M count=10240
10240+0 records in
10240+0 records out
< /code>
У меня есть многопоточная программа, в которой потоки записывают 8 КБ в файл и ищут 16 КБ. Смещение, в которое пишут потоки, является глобальной переменной, которая помогает мне стремиться к этому смещению. < /P>
Это моя программа < /p>
#define _GNU_SOURCE
#define _FILE_OFFSET_BITS 64
#define _LARGEFILE64_SOURCE
#include
#include
#include
#include
#include
#include
#include
#define NUM_THREADS 16
#define OFFSET_SEEK 16384
#define FILE_SIZE 10737418240
long global_offset = 0;
pthread_mutex_t offset_lock = PTHREAD_MUTEX_INITIALIZER;
struct thread_arg
{
char* file_name;
};
int safe_write(int fd, char* buf, unsigned int bufsz)
{
unsigned int rem = bufsz;
unsigned int writ = 0;
while(rem)
{
writ = write(fd, buf, rem);
if(writ == -1)
{
if(errno == EINTR)
continue;
return 1;
}
buf = buf + writ;
rem = rem - writ;
}
return rem;
}
void* thread_main(void *arg)
{
struct thread_arg *my_arg = (struct thread_arg *)arg;
int fd, rc;
long current_offset = 0;
unsigned int bufsz = 8192;
char *buf = NULL;
fd = open(my_arg->file_name, O_RDWR|O_DIRECT);
if(fd < 0)
{
perror("Open failed");
pthread_exit(NULL);
}
rc = posix_memalign((void**)&buf, 4096, bufsz);
if(rc)
{
perror("posix_memalign failed");
close(fd);
pthread_exit(NULL);
}
memset(buf, 'a', bufsz);
while(1)
{
pthread_mutex_lock(&offset_lock);
current_offset = global_offset;
global_offset = global_offset + OFFSET_SEEK;
pthread_mutex_unlock(&offset_lock);
if(current_offset >= FILE_SIZE)
{
free(buf);
close(fd);
return(0);
}
rc = lseek64(fd, (long)current_offset, SEEK_SET);
if(rc < 0)
{
printf("Exiting offset: %ld\n", current_offset);
perror("Seek exit");
free(buf);
close(fd);
pthread_exit(NULL);
}
rc = safe_write(fd, buf, bufsz);
if(rc)
{
perror("Write failed");
free(buf);
close(fd);
pthread_exit(NULL);
}
}
close(fd);
return(0);
}
int main(int argc, char* argv[])
{
int rc = 0, i = 0;
pthread_t threads[NUM_THREADS];
struct thread_arg args[NUM_THREADS] = {0};
if (argc < 2)
{
printf("Usage: %s \n", argv[0]);
return(1);
}
printf("Sizeof long: %lu\n", sizeof(long));
for(i=0; i
# file multi_scatter_write
multi_scatter_write: ELF 64-bit LSB executable
< /code>
Вывод, если я запускаю программу < /p>
# ./multi_scatter_write /root/ext4fs/afile
Sizeof long: 8
Exiting offset: 2147483648
Exiting offset: 2147500032
Seek exit: Success
Seek exit: Success
Exiting offset: 2147516416
Seek exit: Success
Exiting offset: 2147532800
Exiting offset: 2147565568
Seek exit: Success
Seek exit: Success
Exiting offset: 2147581952
Seek exit: Success
Exiting offset: 2147549184
Seek exit: Success
Exiting offset: 2147614720
Seek exit: Success
Exiting offset: 2147598336
Exiting offset: 2147647488
Seek exit: Success
Exiting offset: 2147631104
Seek exit: Success
Exiting offset: 2147663872
Seek exit: Success
Seek exit: Success
Exiting offset: 2147680256
Seek exit: Success
Exiting offset: 2147696640
Seek exit: Success
Exiting offset: 2147729408
Seek exit: Success
Exiting offset: 2147713024
Seek exit: Success
< /code>
Выходные потоки выходят в условиях сбоя LSEEK64, и я предполагаю, что смещение выхода в ближайшее время. Почему это происходит. Что я делаю не так?
Подробнее здесь: https://stackoverflow.com/questions/797 ... nd-int-max
Lseek64 не ищет за пределы int_max ⇐ Linux
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Как преобразовать список[int, int, int] в кортеж[int, int, int], а не в кортеж[int, ...]
Anonymous » » в форуме Python - 0 Ответы
- 287 Просмотры
-
Последнее сообщение Anonymous
-