【问题标题】:Segmentation fault (core dumped) in C UnixC Unix 中的分段错误(核心转储)
【发布时间】:2013-11-12 09:14:03
【问题描述】:

我必须创建一个程序,从命令行获取 n 个参数 arg1、arg2 .... argn,创建 n 个线程,每个线程将读取一个文本文件 argi,并以相反的顺序打印偶数行。

问题是我的程序创建了线程,完成了它们,但实际上他什么也没做。他只打印一些随机字符,每次运行时都不同(我认为是内存中的字符)。

下面是我的代码:

#include <pthread.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define MAXLINE 100
pthread_t myThread[10];
pthread_mutex_t myMutex;

void * fileprint(void * numei) {
    printf("Thread: %ld ...> %s\n", pthread_self(), (char*)numei);
    FILE *fi;
    char line[MAXLINE], *p;
    pthread_mutex_lock(&myMutex);
    int k=0;
    fi = fopen((char*)numei, "r");
    for ( ; ; ) {
        k++;
        p = fgets(line, MAXLINE, fi);
        if (p == NULL) break;
        line[strlen(line) - 1] = '\0';
        if(k %2 ==0){
            for(int j=strlen(line);j>=0;j++){
                printf("%c", line[j]);
            }
        printf("%c","\n");
        }
    }

    fclose(fi);

    printf("Finished thread: %ld ...> %s\n", pthread_self(), (char*)numei);
    pthread_mutex_unlock(&myMutex); 

}


int main(int argc, char* argv[]) {
    pthread_mutex_init(&myMutex, NULL); 
    printf("I'm the father...\n");  

    int i;
    for (i = 1; argv[i]; i++) {
        pthread_create(&myThread[i], NULL, fileprint, (void*)argv[i]);
        printf("Created thread: %ld ...> %s\n", myThread[i], argv[i]);
    }


    for (i = 1; argv[i]; i++) {
        pthread_join(myThread[i], NULL);    
    }

    printf("I'm still the father...\n");


    pthread_mutex_destroy(&myMutex);

    return 1;
}

那么,谁能告诉我有什么问题?我尝试了很多东西来修改,但没有...

【问题讨论】:

  • 你试过在调试器中运行吗?它将停在崩溃的位置,让您检查(并遍历)函数调用堆栈以及检查变量及其值。
  • 哦,当您开始打印出您阅读的行中的终止 '\0' 字符时,您在内部循环中遇到了一个错误。
  • 您可能还想考虑如果fopen 失败会发生什么。
  • 这个问题似乎是题外话,因为它是关于让别人为你思考的问题。

标签: c multithreading unix


【解决方案1】:

如果向后遍历字符串,则必须减少循环内的索引 (j--)。你也应该从strlen(x)-1开始。

【讨论】:

  • 好收获。随着增量,他试图打印从字符串末尾开始的所有内存。
  • 没办法....这是问题所在...我更改、添加、删除了大约 100 行...但我错过了:|谢谢!
【解决方案2】:

此行不正确:

printf("%c","\n");

%c 的操作数必须是 char,而不是 char*。它应该是:

printf("%c",'\n');

或:

printf("%s", "\n");

或:

printf("\n");

但是,我认为这不会导致分段错误,它只会导致打印随机字符。

【讨论】:

    【解决方案3】:
    for (i = 1; argv[i]; i++) {
    

    您也可以使用“argc”,它是 arg 计数器。

     printf("Thread: %ld ...> %s\n", pthread_self(), (char*)numei);
    FILE *fi;
    char line[MAXLINE], *p;
    pthread_mutex_lock(&myMutex);
    

    在您的 fileprint(...) 中,将 printf(...) 放在互斥锁后面,否则其他线程可能会中断它,您的输出会打印一半、奇怪的句子。

    制造

    【讨论】:

      猜你喜欢
      • 2022-01-14
      • 2017-02-25
      • 2016-07-12
      • 2018-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多