Я пытаюсь изучить многопоточное и многопроцессорное программирование. Я очень новичок в многопоточных/обработанных программах и среде Ubuntu. Я работал над кодом ниже в течение 10 часов и исправил все ошибки и предупреждения. Я начал кодировать это с помощью xCode, и он работает отлично и делает именно то, что я хочу, чтобы он делал без каких-либо предупреждений или ошибок в этой среде. Но когда пытаюсь скомпилировать и запускать на Ubuntu, я получаю ошибку сегментации (ядро сбрасывается). Я не мог понять, какая часть кода приводит к этой ошибке. Любые идеи о том, какая часть может вызвать ошибку? или почему я получаю это? Насколько я помню, у Linux нет ядра? Огромное спасибо заранее!Ошибка сегментации (сбрасывание ядра) на виртуальном Ubuntu64bit
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <err.h>
#include <sys/types.h>
#include <dirent.h>
#include <regex.h>
#include <string.h>
#include <stdlib.h>
int pid, i, rc, pid1, counter;
char* iterator[500];
char* file[500];
enum {
WALK_OK = 0,
WALK_BADPATTERN,
WALK_BADOPEN,
};
int walker(const char *dir, const char *pattern)
{
struct dirent *entry;
regex_t reg;
DIR *d;
counter=0;
if (regcomp(®, pattern, REG_EXTENDED | REG_NOSUB))
return WALK_BADPATTERN;
if (!(d = opendir(dir)))
return WALK_BADOPEN;
while ((entry = (readdir(d)))){
if (!regexec(®, entry->d_name, 0, NULL, 0)){
puts(entry->d_name);
file[counter]=entry->d_name;
counter=counter+1;}
}
closedir(d);
regfree(®);
return counter;
}
void* project_statistics(int i){
FILE* f;
// size_t len;
char* line;
int read[3];
int arr[1000];
int p, m, fnl;
int counter2=0;
f=fopen(iterator[i], "r");
if (f==NULL) {
err(1, "%s", iterator[i]);
}
while((line=fgets((char*)read,sizeof(read),f))){
sscanf(line, "%d %d %d",&p, &m, &fnl);
arr[counter2]= p;
counter2++;
}
int *firstHalf = malloc((counter2) * sizeof(int));
memcpy(firstHalf, arr, (counter2) * sizeof(int));
//sort array;
int k, l, tmp;
for (k = 1; k < counter2; k++) {
l = k;
while (l > 0 && firstHalf[l - 1] > firstHalf[l]) {
tmp = firstHalf[l];
firstHalf[l] = firstHalf[l- 1];
firstHalf[l- 1] = tmp;
l--;
}
}
printf("course %d project median: %d, project min: %d, project max: %d\n", i+1, firstHalf[counter2/2], firstHalf[0],firstHalf[counter2-1]);
if(!feof(f)){
err(1, "getIn");
}
pthread_exit(NULL);
}
void* midterm_statistics(int i){
FILE* f;
int read[3];
char* line;
int arr2[1000];
int p, m, fnl;
int counter2=0;
f=fopen(iterator[i], "r");
if (f==NULL) {
err(1, "%s", iterator[i]);
}
while((line=fgets((char*)read,sizeof(read),f))){
sscanf(line, "%d %d %d",&p, &m, &fnl);
arr2[counter2]=m;
counter2++;
}
int *firstHalf = malloc((counter2) * sizeof(int));
memcpy(firstHalf, arr2, (counter2) * sizeof(int));
//sort array;
int k, l, tmp;
for (k = 1; k < counter2; k++) {
l = k;
while (l > 0 && firstHalf[l - 1] > firstHalf[l]) {
tmp = firstHalf[l];
firstHalf[l] = firstHalf[l- 1];
firstHalf[l- 1] = tmp;
l--;
}
}
printf("course %d project median: %d, project min: %d, project max: %d\n", i+1, firstHalf[counter2/2], firstHalf[0],firstHalf[counter2-1]);
if(!feof(f)){
err(1, "getIn");
}
pthread_exit(NULL);
}
void* final_statistics(int i){
FILE* f;
char* line;
int arr3[1000];
int read[3];
int p, m, fnl;
int counter2=0;
f=fopen(iterator[i], "r");
if (f==NULL) {
err(1, "%s", iterator[i]);
}
while((line=fgets((char*)read,sizeof(read),f))){
sscanf(line, "%d %d %d",&p, &m, &fnl);
arr3[counter2]=fnl;
counter2++;
}
int *firstHalf = malloc((counter2) * sizeof(int));
memcpy(firstHalf, arr3, (counter2) * sizeof(int));
//sort array;
int k, l, tmp;
for (k = 1; k < counter2; k++) {
l = k;
while (l > 0 && firstHalf[l - 1] > firstHalf[l]) {
tmp = firstHalf[l];
firstHalf[l] = firstHalf[l- 1];
firstHalf[l- 1] = tmp;
l--;
}
}
printf("course %d project median: %d, project min: %d, project max: %d\n", i+1, firstHalf[counter2/2], firstHalf[0],firstHalf[counter2-1]);
if(!feof(f)){
err(1, "getIn");
}
pthread_exit(NULL);
}
int main(int argc, const char * argv[]) {
char k[500];
int counter1=walker("/home/ey/Desktop/sampleFolder/", ".\\.txt");
for (i=0; i<counter1; i++) {
strcpy(k, "/home/ey/Desktop/sampleFolder/");
strcat(k, file[i]);
iterator[i]=strdup(k);
printf("%s",iterator[i]);
}
printf("\nMaster is starting\n");
pthread_t tid1[counter1], tid2[counter1], tid3[counter1];
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
printf("\nslave1 start\n");
printf("\n~Project Statistics~\n");
sleep(2);
for (i=0; i<counter1; i++) {
rc=pthread_create(&tid1[i], &attr, (void*)*project_statistics,(void*)(intptr_t)i);
}
sleep(2);
printf("\nslave1 done\n");
printf("\nslave2 start\n");
printf("\n~Midterm Statistics~\n");
pid=fork();
sleep(2);
if (pid==0) {
for (i=0; i<counter1; i++) {
rc=pthread_create(&tid2[i], &attr,(void*)*midterm_statistics, (void*)(intptr_t)i);
}
sleep(2);
printf("\nslave2 done\n");
printf("\nslave3 start\n");
printf("\n~Final Statistics~\n");
}
sleep(2);
pid1=fork();
sleep(2);
if ((pid1==0)&&(pid==0)) {
for (i=0; i<counter1; i++) {
rc=pthread_create(&tid3[i], &attr, (void*)*final_statistics, (void*)(intptr_t)i);
}
sleep(2);
printf("\nslave3 done\n");
printf("\nMaster is done\n");
}
sleep(1);
pthread_attr_destroy(&attr);
pthread_exit(NULL);
}
«Основной файл» - это копия памяти процесса и дополнительная информация. Он записывается в файл и может использоваться для отладки программы. Если вы не можете найти основной файл, отметьте 'ulimit -c'. Возможно, вам придется изменить лимит пользователя, например. 50000. (запустите команду ulimit -c 50000). Если у вас есть исполняемый файл и основной файл, запустите 'gdb exefile corefile', чтобы запустить отладчик gnu. Затем выполните команду 'backtrace' внутри gdb. Надеюсь, это будет отображаться там, где ваш код не работает. Используйте параметры gcc -O0 -ggdb для получения информации об отладке. –
Я раньше не использовал отладчик gnu. Но когда я набрал ulimit -c, я получил 0, это нормально? также, когда я набрал ulimit -c 50000, ничего не появилось. – Valentino
Ничего не отображается, но в следующий раз, когда ваша программа выйдет из строя, будет создан основной файл. Слово предупреждения: Gdb - не самый простой отладчик, доступный в Linux. Вы можете искать альтернативы. ddd может быть лучше. –