我正在嘗試學習多線程和多進程編程。我對於多線程/編程和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可能會更好。 –