【问题标题】:File handling using API thread in C在 C 中使用 API 线程处理文件
【发布时间】:2010-11-01 12:58:29
【问题描述】:

我正在制作一个在 C 中使用 API 线程的应用程序,该程序采用名称无序的 N 个文件(N>2),每个文件生成一个执行线程,使用函数 qsort 对文件进行排序,之后作为有序文件,每个线程都应该创建一个文件,保持原始文件完整,并将排序后的文件显示到另一个扩展名为 <.sorted> 的文件中。该程序对数字进行排序没有问题,即使我将标准输出显示在屏幕上,但是当我尝试创建扩展名为 .sorted 的输出文件时,程序就会中断。

这是我的代码文件.c

#include <stdio.h>              /* Standard buffered input/output        */
#include <stdlib.h>             /* Standard library functions            */
#include <string.h>             /* String operations                     */
#include <pthread.h>        /* Thread related functions              */
#include "pf1.h"        /* Header specific to this app           */



pthread_attr_t attr;

void *thread_worker(void *name_file)
{

FILE *entrada, *salida;
char* nombres = (char*)name_file; 
int numero;
char temp [10000];

int i;
stats_t estadisticas;

printf ("File_name:%s\n", nombres);
entrada = fopen(nombres, "r");
salida =  fopen (strcat(nombres, ".sorted"), "w");

while (!feof(entrada)){
fscanf (entrada, "%s\n",temp);
numero++;
}

char* lista[numero]; //array to sort the file
rewind (entrada);

    for (i=0;i<numero;i++) 
    {

        fscanf(entrada," %[^\n]", temp);


        lista[i] = (char*)malloc((strlen(temp)+1)*sizeof(char));

        strcpy(lista[i], temp);

    }


size_t large = sizeof(lista) / sizeof(char *);



qsort(lista,large ,sizeof(char *) ,cstring_cmp );

printf ("Archivo Ordenado\n", i+1);

for (i=0;i<large;i++)


printf("%s\n",lista[i]);


 pthread_exit(NULL);
}


int main(int argc, char *argv [])
{

stats_t **stats;
int i, rc;
 pthread_t my_threads[argc-1]; 
 pthread_attr_init(&attr);

if (argc <3) {
printf ("|files| > 2\n");
}else{
printf("files to sorted: %d\n", argc - 1);

for (i = 1; i < argc; i++){ 

    //printf("%s%s\n", argv[i], (i < argc-1) ? " " : "");

rc = pthread_create(&my_threads[i], &attr, thread_worker, (void *)argv[i]);
      if (rc){
         printf("ERROR; return code from pthread_create() is %d\n",rc);
         return -1;
      }
}

}
  return 0;

} /*end main */

这是 mi 文件.h

#ifndef PF1_H_

#define PF1_H_





typedef struct _stats_t

{

    char *longest, *shortest;

    unsigned int numlines;

} stats_t;

int cstring_cmp(const void *a, const void *b)

{

    const char **ia = (const char **)a;

    const char **ib = (const char **)b;

    return -strcasecmp(*ia, *ib);

    /* strcmp functions works exactly as expected from

    comparison function */

}


void print_cstring_array(char **array, size_t len)

{

    size_t i;



    for(i=0; i<len; i++)

        printf("%s | ", array[i]);



    putchar('\n');

}




#endif /* PF1_1_H_ */

我需要一些帮助来解决这个问题,因为我看不出是哪一个问题......在此先感谢大家,请原谅我的英语

【问题讨论】:

    标签: c multithreading file segmentation-fault


    【解决方案1】:

    这行可能是你的问题:

    salida =  fopen (strcat(nombres, ".sorted"), "w");
    

    据我所知,nombres 变量来自argv。由于您不是为argv 分配内存的人,因此您不知道“.sorted”会有额外的空间(可能不会有)。如果你 strcpy 将它放到你自己的缓冲区中,并为“.sorted”留出空间,你应该没问题。

    #define EXT_LEN 7
    #define MAX_TOTAL_LEN 250
    #define MAX_FILE_LEN 242 //MAX_TOTAL_LEN - EXT_LEN - 1
    
    char *name_ptr;
    char nombres[MAX_TOTAL_LEN];
    int len;
    
    name_ptr = (char*)name_file;
    len = strlen(name_ptr);
    if (len > MAX_FILE_LEN) {
        len = MAX_FILE_LEN;
    }
    strncpy(nombres, name_ptr, len);
    strcpy(nombres+len, ".sorted");
    salida =  fopen (nombres, "w"); 
    

    【讨论】:

    • 对不起,我无法理解你的想法......对不起,我是新手
    • 当使用strcat 时,额外的字符必须放在内存中的某个地方。如果您没有使用数组在堆栈上分配(足够的)内存,或者使用new/malloc 在堆上分配(足够)内存,那么您可能会覆盖其他内容(例如返回地址)。当参数作为argv 传入时,通常这些字符串中只有足够的空间用于参数,没有额外的空间。通过在其末尾附加“.sorted”,您正在写入您尚未分配的内存并覆盖您不应该分配的内容。
    【解决方案2】:

    我曾经遇到过在调用线程执行函数时不传递 int 标识符的问题。尝试使用整数标识符和文件名构建一个结构,然后将其作为参数传递给您的 thread_worker() 函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-28
      • 2019-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-28
      相关资源
      最近更新 更多