【发布时间】:2021-08-31 17:56:14
【问题描述】:
使用 gcc hw2.c -o x -lpthread 编译
free(): invalid size
free(): invalid size
free(): invalid size
nano infile.txt
我假设它可能与文件指针有关?信号量已被注释掉以首先解决此问题。所有答案都指向指针,但切换起来并没有多大帮助。我尝试过不同的编译方式,但也无济于事。
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <semaphore.h>
#include <fcntl.h>
#include <sys/stat.h>
//sem_t X;
void process(){
//sem_open("X", O_CREAT,0777,0);
int ret;
int N = 1;
pid_t pid;
FILE* infile = fopen ("infile.txt", "r");
for(int i = 0; i< 50; i++){
fscanf (infile, "%d", &N);
fclose (infile);
printf("N: %d Process ID: %d",N,pid);
infile = fopen("infile.txt", "w");
N++;
//sem_post(&X);
fprintf(infile,"%d",N);
fflush(infile);
fclose(infile);
}
printf("\n");
int c;
//sem_getvalue(&X,&c);
printf(" \n \n \n%d",c);
}
int main(){
int pid, pid1, pid2;
pid = fork();
if(pid == 0){
//child1, Last
printf("Starting Process C: ");
process();
}
else{
pid1 = fork();
if(pid1 == 0){
//child2, Middle
printf("Starting Process B: ");
process();
}
else{
pid2 = fork();
if(pid2 == 0){
//child 3, First
printf("Starting Process A: ");
process();
}
else{
}
}
}
//sem_close(&X);
//sem_unlink(&X);
}
【问题讨论】:
-
sem_post(&X)、sem_close(&X);等会导致未定义行为,因为您从未设置过X。您应该将 X 声明为sem_t *X并将其分配给X = sem_open()。 -
printf("N: %d Process ID: %d",N,pid);读取未初始化的pid。 - 您还应该在您的子进程上waitpid在退出父进程之前完成。我还建议在process()函数的末尾添加一个exit()。 -
这是运行时错误,不是编译器错误。
-
顺便说一句,您不需要
-lpthread,但我建议-Wall -Wextra -pedantic -pedantic-errors和-g -fsanitize=address更容易发现错误。
标签: c compiler-errors process pthreads