동시에 백그라운드로 프로그램을 수행했을시 간헐적인 에러발생

kluster86의 이미지

안녕하세요~

프로그래밍을 하다가 도저히 원인을 알 수 없어서 질문드립니다ㅠ_ㅠ

단순한 코드인데요, 대용량(?)문서를 처리하면 간헐적으로 이상증세를 보이고 있습니다.

간단히 요약하면 아래 코드는 A라는 문서를 읽어서 A.step1에 쓰도록 구현이 되어있습니다.

이 바이너리를 통하여 문서를 테스트하면, 별탈없이 결과를 출력합니다.

그런데 이것을 동시에 백그라운드로 여러개를 돌렸을때, 문제가 발생합니다. 그것도 간헐적으로요 ㅠㅠ

수행은 아래와 같이 합니다. 전부 백그라운드로 동시에 수행합니다.

*아래 괄호속에 있는것은 각 파일의 용량입니다.
A(5G) => 바이너리 => A.step1
B(5G) => 바이너리 => B.step1
C(3G) => 바이너리 => C.step1
D(3G) => 바이너리 => D.step1
E(1.5G) => 바이너리 => E.step1
F(1.5G) => 바이너리 => F.step1
G(2.5G) => 바이너리 => G.step1
H(2.5G) => 바이너리 => H.step1

이렇게 수행을 하고 나면 A라는 문서의 일부분(한 10라인정도?)가... 간헐적으로 B결과에 박혀있는 상황이 발생하곤 합니다(정말 간헐적으로 생깁니다)

하나의 파일을 가지고만 수행을 했을경우 문제는 없는데 저렇게 대량의 파일을 처리했을때 뭔가 메모리를 잘못 읽는지

서로다른문서인데 그 일부분이 다른 문서에 박히는 경우가 생깁니다ㅠㅠ

혹시 위와 같은 원인을 아시는 분 계신가요? 정말 간헐적으로 발생하는것은 추적하기도 어렵네요. 메모릭leak같은것도 체크해봤는데 특별한 문제는 발견되지 않았습니다.

아래는 코드 입니다.

===코드==================================

#define BUF_SIZE 4096
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int main(int argc, char **argv)
{
    FILE *inFile = NULL;
    FILE *outFile = NULL;
 
    char *line = NULL;
    size_t  len   = 0;
    ssize_t read  = 0;
 
    char name[BUF_SIZE]="\0";
 
 
    inFile = fopen(argv[1], "r");
    outFile = fopen(argv[2], "w");
 
 
    while ((read = getline(&line, &len, inFile)) != -1)
    {
 
        line[read - 1] = '\0';
 
        if (strncmp(line, "#TITLE:", 6) == 0)
        {
            strcpy(title, line + 6);
        }
        else if (strncmp(line, "#END:",5) == 0) // end of doc
        {
            fprintf(outFile, "#TITLE_ALIAS:%s\n", title);
        }
 
        fprintf(outFile, "%s\n", line);
 
    }
 
    if (line) free(line);
    if (inFile) fclose(inFile);
    if (outFile) fclose(outFile);

=====================================================

의견 주시면 감사하겠습니다~

rookey94의 이미지

왠지...line 변수에 메모리를 할당해 보시면.....

익명 사용자의 이미지

프로그램 구조가 getline 매뉴얼 예제와 구조가 똑 같군요. getline() 에서 malloc, realloc을 내부적으로 호출한다니 루프내에서 메모리 문제는 없을 것으로 보여집니다.

근데 메모리 문제가 아니라면 어떻게 이런 문제가 발생했을까요? 하지만 메모리 문제는 거의 불가능해보입니다. 일단 문법적으로 오류가 없는 것 같고. 파악되지 않은 문제가 있다하더라도 세그멘테이션 폴트가 먼저 발생할 테니까요.

답을 발견하시면 꼭 결과를 올려주시길 부탁드립니다.

kluster86의 이미지

말씀주신대로 getline은 내부적으로 할당 해제하기 때문에 큰 문지는없을것같은대요

저도 참 모르겟네요ㅠㅠ 해결책이 나온다면 꼭 공유드리도록 하겟습니다

욥!!!! 늦게 시작했지만 열심히하면 된다!!!!!

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.