我正在尝试学习多线程和多进程编程。我对于多线程/编程和Ubuntu环境都很新。我在下面的代码上工作了10个小时,并修复了所有错误和警告。我开始用xCode对其进行编码,并且它运行完美,并且完全按照我希望的方式执行,而不会在该环境中发出任何警告或错误。但是,当试图在Ubuntu上编译和运行时,我得到了分段错误(核心转储),我无法理解导致此错误的代码的哪一部分。任何想法的哪一部分可能会导致错误?或为什么我得到那个?正如我记得Linux没有核心?提前感谢你!虚拟Ubuntu64位上的分段错误(核心转储)
#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调试器。然后在gdb中发出命令'backtrace'。这应该显示你的代码失败,希望。使用gcc选项-O0 -ggdb来获取调试信息。 –
我以前从未使用过gnu调试器。但是,当我输入ulimit -c,我得到一个0是正常的?当我输入ulimit -c 50000时也没有出现。 – Valentino
没有'显示',但下一次你的程序内核时,核心文件将被生成。警告词:Gdb不是Linux上最简单的调试器。你可能想要寻找替代品。 DDD可能会更好。 –