gpt4 book ai didi

c - 如何检测我的哪一段代码生成 "Fatal error: glibc detected an invalid stdio handle"错误?

转载 作者:行者123 更新时间:2023-11-30 16:15:26 35 4
gpt4 key购买 nike

我正在尝试编写一个简单的程序,使用 2 个进程将一个文件复制到另一个文件中。我想用共享内存打开两个文件,并以互斥的方式获取一 block 1Byte的共享内存作为交换内存。

所以主进程应该打开这两个文件并将它们放入共享内存中;fork两次,得到2个进程A和B。进程 A 应读取第一个文件的 1 个字节,将其放入共享交换内存中并解锁进程 B 的互斥体。进程 B 应从共享交换内存复制文件并将其放入其文件中,并解锁进程 A 的互斥体。等等。

#define SIZE 4096

void reader_process(FILE* fptr,char*exch, sem_t*mut){
while(1){
sem_wait(mut);
*exch = (char) getc(fptr);
sem_post(mut+1);
}
}

void writer_process(FILE* fptr,char*exch, sem_t*mut){
if(*exch == EOF){
printf("done\n");
exit(0);
}

while(1){
sem_wait(mut);
putc((int)*exch,fptr);
sem_post(mut-1);
}
}

int main(int argc, char *argv[]){
FILE* shared_f_ptr[2];
pid_t pid;
//2 files name.
char *files[2];
int fd[2];

//open files.
files[0] = argv[1];
printf("%s\n",files[0]);
FILE* fpointer1 = fopen(files[0],"r+");
if (fpointer1 == NULL){
perror("fopen\n");
exit(-1);
}
fd[0] = fileno(fpointer1);

files[1] = argv[2];
printf("%s\n",files[1]);
FILE* fpointer2 = fopen(files[1],"r+");
if (fpointer2 == NULL){
perror("fopen\n");
exit(-1);
}
fd[1] = fileno(fpointer2);

//shared File pointers.
shared_f_ptr[0] = (FILE*)mmap(NULL, SIZE*sizeof(char),
PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS,
fd[0], 0);
if (shared_f_ptr[0] == MAP_FAILED){
perror("mmap\n");
exit(-1);
}

shared_f_ptr[1] = (FILE*)mmap(NULL, SIZE*sizeof(char),
PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS,
fd[1], 0);
if (shared_f_ptr[1] == MAP_FAILED){
perror("mmap\n");
exit(-1);
}
//shared mem for 1B exchange.
char *shared_exchange = (char*)mmap(NULL, sizeof(char),
PROT_READ | PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS,
-1, 0);
if (shared_exchange == MAP_FAILED){
perror("mmap\n");
exit(-1);
}

//mutex.
sem_t *mut = (sem_t*)mmap(NULL, 2*sizeof(sem_t),
PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS,
-1, 0);
sem_init(&mut[0],1,0);
sem_init(&mut[1],1,0);



//fork.

pid = fork();
if (pid == 0) {
reader_process(shared_f_ptr[0],
shared_exchange, &mut[0]);
}
if (pid == -1){
perror("fork\n");
exit(-1);
}

else pid = fork();

if (pid == 0) writer_process(shared_f_ptr[1],
shared_exchange, &mut[1]);

if (pid == -1){
perror("fork\n");
exit(-1);
}

else{
sem_post(&mut[0]);
}
}

我没想到会出现错误 fatal error :glibc 检测到无效的 stdio 句柄,但我真的不知道如何找到导致问题的原因。

最佳答案

不要这样做:

//shared File pointers.
shared_f_ptr[0] = (FILE*)mmap(NULL, SIZE*sizeof(char),
PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS,
fd[0], 0);
if (shared_f_ptr[0] == MAP_FAILED){
perror("mmap\n");
exit(-1);
}

shared_f_ptr[1] = (FILE*)mmap(NULL, SIZE*sizeof(char),
PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS,
fd[1], 0);
if (shared_f_ptr[1] == MAP_FAILED){
perror("mmap\n");
exit(-1);
}

改用这个:

shared_f_ptr[0] = fpointer1;
shared_f_ptr[1] = fpointer2;

不要使用每个FILE底层的文件描述符。相反,只需使用 FILE 本身即可。

此外,不要使用 fpointer1fpointer2,只需使用 shared_f_ptr[0]shared_f_ptr[1] >.

这是 FILE 结构的可能定义:

typedef struct _IO_FILE
{
int __fd;
int __flags;
int __unget;
char *__buffer;
struct {
size_t __orig;
size_t __size;
size_t __written;
} __bufsiz;
fpos_t __fpos;
} FILE;

正如你所看到的,它是一个结构体,而不仅仅是一个平面指针。

关于c - 如何检测我的哪一段代码生成 "Fatal error: glibc detected an invalid stdio handle"错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57098060/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com