CGI with c // sqlite DB // 웹 연동 질문 입니다.

ks1167의 이미지

웹(IE)에서

busybox(1.5.0) httpd 를 이용한

인베디드 웹 서버로 접속했구요

c로 구현한 CGI 를 이용해서 DB내용을 수정해야 합니다.

이미 pc 아파치 웹서버를 이용해서 실험해서 성공했기 때문에 코드에는
문제가 없다고 생각 되어 집니다. (임의 생각) 같은 코드로

여찌됐든 크로스컴파일을해서 cgi를 임베디드에 올린 후에
DB파일을 www dir로 가져와서(dir 권한 문제때문에) 실행했구요

문제는 splite 에서 제공하는 c API 중 DB를 오픈하는 함수인
int sqlite3_open(DB)
함수가 머가 문제 인지 실행이 안되고 종료가 됩니다.
(리턴값도 없는 에러 강종인듯하네요)

그전까지의 결과만이

출력 html에 결과가 표시 됩니다.
============================================
sqlite3 *db;
int rc;

(중략)
printf("Before DB open\n");
rc = sqlite3_open(dbname, &db);
printf("rc = %d\n", rc);
(이하 생략)
============================================

출력 html에 open함수 실행직전까지만 출력 되네요..

libsqlite3.so.0.8.6 사용한 sqlite 라이브러리입니다.

부족하신 정보 말씀해주시면 다시 알려드릴께요

조언 부탁드립니다.

그노카스의 이미지

printf("Before DB open : %s\n", dbname);
해서, dbname이 정상적이 찍히고 있는지 먼저 확인하고,

실제 cgi에서 dbname에 있는 파일을 엑세스 가능한지를 확인해봐야 할 듯 하네요.
FILE *fp = fopen (dbname, "a"); 등등으로.. 그 db파일을 수동(?)으로
열어보시는 테스트를 먼저 해보세요.. ( fp가 정상적인지.. )

거기에 문제의 원인이 있지 않을까.. 해서요.

ks1167의 이미지

=============================================
FILE *fp;
if ((fp = fopen(dbname, "rb")) == NULL)
{
printf("Error opening file.\n");
}
fclose(fp);
=============================================

위 코드 추가 해서 실행 해보니 에러코드 출력이 안된거 보니 정상인거 같아요.
실행 결과 html 출력은 dbname은 이미 계속 출력 하게끔해논거라서..
잘 나오는듯 하네요

dbname = iptdb

ks1167의 이미지

음.. 지금은 sqlite3를 debug모드로 complie 해서 결과를 보려고 하고 있는데
컴파일은 한거 같은데 메세지가 나오는건지 안나오는건지.. 잘모르겠네요.. 후

그노카스의 이미지

제 경험상,
sqlite3 라이브러리에 문제일 가능성은 극히 적습니다.
물론, sqlite3를 -g 옵션을 넣어 컴파일 후, gdb로 볼 수 있다면이야..
뭐, 훨씬 쉽게 문제를 해결할 수 있겠지만요.. ㅎㅎ

뭐 같은 얘기지만, 에러코드가 출력이 안되어서 정상이라 판단하기 보다,
SQLite 용 DB파일이 만들어질 곳에, 파일을 "쓰기"모드로 열어서
실제 Write가 되는지, 먼저 확인해 보시는게 좋지않을까요..

해결책은 못드리고, 자꾸 쓸데없는 일만 시키는 것 같은데... ㅎㅎ
제 생각에는.. sqlite3를 새로 컴파일해서 하는 것 보다,
이 일을 먼저해보는게 시간을 벌 수 있을듯해서요. :-)

ks1167의 이미지

다른 파일 오픈 확인 해 보았구요
아 참 제게 cgi 처음 테스트 할때
파일 오픈해서 읽고 결과를 write하며 누적하는
설문조사 통계프로그램을 돌려봤기 때문에
검증은 이미 된걸로 생각됩니다.

지금 생각해 둔게 하나 있는데..
제 글 내용만 보고 그걸 유추하기는 어렵네요

음 그리고 글에 적은 내용의 문제는
sqlite3의 open 함수 실행시 실행완료가 안되고 종료입니다.
완료가 안되기 때문에

아랫분 말씀의 리턴값 확인은 자체가 안되고 있습니다.

제가 open을 하기 전에 이미 system 자체에서 계속 open을 하고 있었다..
일까나;; 이럴 경우와 그게 문제가 되는지 확인중입니다.

terzeron의 이미지

이런 문제가 쉽게 해결되지 않는 이유는
리턴값에 대한 검사, 그리고 리턴값이 0보다 작거나 NULL인 경우 에러값 확인
이런 절차가 갖춰져 있지 않기 때문입니다.

printf("Before DB open\n");
rc = sqlite3_open(dbname, &db);
printf("rc = %d\n", rc);

여기서 rc가 0이면 open까지는 문제가 아니니
그 다음 문장이 제대로 실행되었는지 확인해보시기 바랍니다.
ks1167의 이미지

출력 확인은 이미 제 글 내용에 있습니다.
"open 함수 다음 내용이 실행 되지 않고 그전 결과 까지의 출력만 확인이 되었다"

open함수의 리턴값 확인이 안되기 때문에
open함수 실행중 종료라고 생각됩니다.

select99의 이미지

환경변수혹은권한등의 문제일수 있습니다.

http 계정으로 로그인해서 수동으로 수행해보세요.

ks1167의 이미지

db 파일을 www dir에 놓고 하는 중이고 dir // file 권한을 766으로 주었구요

웹에서 접속할때 / 권한 계정으로 하고 있습니다.
=============================
busybox httpd.conf 내용중 포함
=============================
/:admin:1111
=============================

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.