fopen() 시 NULL값 (파일접근에러)

위 분류에 속하지 않는 모든 주제

Moderator: Dry8r3aD

Post Reply
mizsmile
Posts: 12
Joined: 2009/01/17 Sat 3:49 pm

fopen() 시 NULL값 (파일접근에러)

Post by mizsmile » 2009/02/25 Wed 3:03 pm

우분투환경에셔 C로 cgi파일 만들어서 작업하고 있습니다..

궁금한거는..

cgi에서 fopen() 을 이용해서 파일업로드할 수 있게 하려고 하는데요..

FILE fp = fopen("test.txt", "wb"); 하면.. 자꾸 NULL 값이 나와서 파일에 접근할 수 없다고 하는데요..

이유가 뭔지 모르겠어서요..

여기에다가 물어봐도 될지 모르겠지만.. 혹시 답변을 주신다면 너무 감사드릴것 같습니다..

작업페이지는 var/www/manager/upload.cgi 입니다..

User avatar
JiNooNi
Posts: 100
Joined: 2008/04/03 Thu 9:07 am
Location: 부산
Contact:

Re: fopen() 시 NULL값 (파일접근에러)

Post by JiNooNi » 2009/02/25 Wed 3:26 pm

cgi 프로그래밍과 리눅스 파일 입출력은 안해봐서 잘 모르겠는데....... 파일 입출력시에, 파일 포인터로 받아야 하지 않나요?

FILE *fp = fopen("test.txt", "wb");

이렇게요. 확인 해보시겠어요 :)

mizsmile
Posts: 12
Joined: 2009/01/17 Sat 3:49 pm

Re: fopen() 시 NULL값 (파일접근에러)

Post by mizsmile » 2009/02/26 Thu 10:08 am

에고 제가 글올릴때 *를 빼먹었네요..
포인터로 해서 작업한거였어요.. ^^

우분투에서 설정같은걸 해야 하는게 있는지.. 궁금하네요..

User avatar
ihavnoth
Posts: 880
Joined: 2008/09/19 Fri 11:08 pm
Location: 경기/평택
Contact:

Re: fopen() 시 NULL값 (파일접근에러)

Post by ihavnoth » 2009/02/26 Thu 10:34 am

C로 작성한 cgi든 Perl로 작성하던 Bash로 하던...

설정에는 특별한 차이는 없습니다..

$ ls /etc/apache2/mods-enabled/cgi.load
이 파일확인 없으면

$ sudo a2enmod cgi
로 활성화 시켜줍니다.

$ sudo vi /etc/apache2/mods-enabled/mime.conf
이 파일에서 AddHandler cgi-script .cgi 이 부분을 확인합니다.

기본적으로 cgi가 허용된 디렉토리는 cgi-bin입니다.

/etc/apache2/sites-enabled/000-default
[code:2i2ocsvo]
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
</Directory>
[/code:2i2ocsvo]

/usr/lib/cgi-bin에 cgi프로그램 넣고

http://localhost/cgi-bin/upload.cgi
로 확인하시면됩니다.

$ cat upload.c
[code:2i2ocsvo]
#include <stdio.h>

int main()
{
printf("Content-type: text/html\n\n");
printf("Hello World\n");

return 0;
}
[/code:2i2ocsvo]

작동 안될때는
$ tail -f /var/log/apache2/error.log
켜놓고 HTTP접근해서 확인해 보시길....

fopen퍼미션 문제는 chmod나 chown으로 적절하게
권한 설정해주시면 됩니다.
Last edited by ihavnoth on 2009/02/26 Thu 10:43 am, edited 1 time in total.

uriel
Posts: 51
Joined: 2008/03/31 Mon 6:21 pm

Re: fopen() 시 NULL값 (파일접근에러)

Post by uriel » 2009/02/26 Thu 10:40 am

fopen()의 return 값이 NULL이라면 해당 파일이 없는 경우가 가장 많습니다. (구체적인 것은 return이 NULL인 경우 errno를 찍어보면 됩니다.
[code:1mv9mblw]pritnf("%s\n", strerr(errno));
[/code:1mv9mblw]
정도면 되겠네요.

일반적인 이야기를 하나 더 하면, cgi의 경우 일반적으로 cgi 자체가 있는 directory와 실제로 돌아가는 path가 다른 경우가 많습니다. test.txt 파일의 위치가 맞는지 한 번 체크 해 보세요.

mizsmile
Posts: 12
Joined: 2009/01/17 Sat 3:49 pm

Re: fopen() 시 NULL값 (파일접근에러)

Post by mizsmile » 2009/02/26 Thu 7:05 pm

친절한 답변 너무들 감사합니다..

저의 cgi-bin 설정은...

#ScripAlias /cgi-bin/ /var/www/bin/
#<Directory "/var/www/bin">
# AllowOverride None
# Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
# AddHandler cgi-script .cgi .pl
# Order allow,deny
# Allow from all
#</Directory>

ErrorLog /var/log/apache2/error.log

# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn

CustomLog /var/log/apache2/access.log combined
ServerSignature On

<Directory /var/www/manager>
AllowOverride None
Options +ExecCGI
Order allow,deny
Allow from all
AddHandler cgi-script .cgi
</Directory>

여기저기 사이트 찾아서 설정해 놓은건데요..
위와 같이 되어 있어서 manager 디렉토리에서도 실행되도록 하고 있어요..

그리고..

uriel 님 말씀대로 errno를 찍어봤는데요..
제가 우분투 생초보, C 완전 모름.. --;; 인 상태라 그것 찾아서 해보는데도 헤맸답니다. ^^;
아무튼.. 에러내용은 Permission denied !! 이라고 하네요.

웹페이지(upload.cgi)에서 첨부파일 업로드하는 건데.. Permission denied 이거는 어떻게 처리하는걸까요??

ihavnoth님..
fopen퍼미션 문제는 chmod나 chown으로 적절하게 권한 설정해주시면 됩니다. 라고 하셨는데..

적절하게는... 어떻게 해야 하는 걸까요??

완전 깜깜합니다..

User avatar
ihavnoth
Posts: 880
Joined: 2008/09/19 Fri 11:08 pm
Location: 경기/평택
Contact:

Re: fopen() 시 NULL값 (파일접근에러)

Post by ihavnoth » 2009/02/27 Fri 4:00 am

$ man chmod
$ man chown

$ ps -ef | grep apache2

브라우져가 서버에 CGI 실행 요청 ->
서버의 아파치가 CGI 실행 ->
결과값을 브라우져에 다시 보냄

CGI는 아파치가 호출하고 특별한 설정이 없다면

아파치 euid가 CGI의 euid가 될것입니다.

ps의 값을 보시면 apache2는 www-data으로 실행되 있습니다.

결국 CGI가 fopen할때 www-data가 그 파일에 대해서

모드에 맞는(fopen할때 모드) 권한이 있어야합니다.

파일이 존재하지 않아서 생성할때는 그 디렉토리에 쓰기와 실행 권한이 있어야합니다.

[code:2obwaqpt]
$ cd /usr/lib/cgi-bin

$ sudo mkdir upload

$ sudo chown www-data upload

$ sudo chmod 300 upload

$ cat upload.c
...
FILE *fp = fopen("upload/test.txt","w+");
fclose(fp);
...
[/code:2obwaqpt]

Post Reply