else에서 코어 덤프..

익명 사용자의 이미지

#include
#include
#include
#include
#define BUF_SIZE 1024

int main(int argc, char *argv[]){
int fd1, fd2, len;
long size;
char *buf[BUF_SIZE];

if (argc == 1) /*1 ./mycat*/
{
fd1 = 0;
while(size = read(fd1, buf, 1024))
{
write(1, buf, size);
}
}
else
{
if(strcmp(argv[1], ">") == 0) /*2 ./mycat “>” out*/
{
fd1 = open(argv[2], O_CREAT | O_WRONLY, 0666);
while(len = read(0,buf,BUF_SIZE))
{
write(fd1,buf,len);
}
close(fd1);
}
else
{
if(strcmp(argv[2], ">") == 0) /*4 ./mycat mycat.c “>” out*/
{

}
else if(strcmp(argv[2], ">>") == 0) /*5 ./mycat mycat.c “>>” out*/
{

}
else /*3 ./mycat mycat.c*/
{
fd1 = open(argv[1], O_RDONLY);
len = read(fd1, buf, BUF_SIZE);
write(1, buf, len);
close(fd1);
}
}
}
}

cat 만드는 프로그램을 전부 맞쳤는데 모든 if, else if문은 정상으로 전부 작동을 하는데 맨 마지막
else /*3 ./mycat mycat.c*/
{
fd1 = open(argv[1], O_RDONLY);
len = read(fd1, buf, BUF_SIZE);
write(1, buf, len);
close(fd1);
}

여기에서 세그멘테이션 오류 (코어 덤프됨)가 뜹니다.. 구글링 하면서 찾아보고 gdb도 실행해서 찾아봤는데 그냥 메인이라고만 뜨고 찾지를 못하겠네요... 혹시 문제가 될만한 점이 있을까요?

라스코니의 이미지

write(fd2, .... )???? 또는 O_RDONLY 인데 write 해서요????

익명 사용자의 이미지

else 안에 내용은 제가 따로 만들어서 실행을 시켜봤는데 이상 없이 돌아가는데

else에 접근만 하면은 세그먼트 오류가 떠서 테스트로 그냥 printf만 넣어도 printf문이 실행이 되지 않고

"세그멘테이션 오류 (코어 덤프됨)" 떠버리네요..

라스코니의 이미지

우선 < c_o_d_e > < _/c_o_d_e > 이렇게 둘러싸서 올려보세요.
밑줄은 지우시고요.

익명 사용자의 이미지

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#define BUF_SIZE 1024
 
int main(int argc, char *argv[]){
	int fd1, fd2, len;
	long size;
	char *buf[BUF_SIZE];
 
	if (argc == 1) /*1 ./mycat*/
	{
		fd1 = 0;
		while(size = read(fd1, buf, 1024))
		{
			write(1, buf, size);
		}
	}
	else
	{
		if(strcmp(argv[1], ">") == 0) /*2 ./mycat “>” out*/
		{
			fd1 = open(argv[2], O_CREAT | O_WRONLY, 0666);
			while(len = read(0,buf,BUF_SIZE))
			{ 
				write(fd1,buf,len);
			}
			close(fd1);
		}
		else
		{
			if(strcmp(argv[2], ">") == 0) /*4 ./mycat mycat.c “>” out*/
			{
				fd1 = open(argv[1], O_RDONLY);
				fd2 = open(argv[3], O_CREAT | O_WRONLY , 0666);
				do {
					len = read(fd1, buf, BUF_SIZE);
					write(fd2, buf, len);
				}while(len);
				close(fd1);
				close(fd2);
			}
			else if(strcmp(argv[2], ">>") == 0) /*5 ./mycat mycat.c “>>” out*/
			{
 
			}
			else /*3 ./mycat mycat.c*/
			{	
				fd1 = open(argv[1], O_RDONLY);
				len = read(fd1, buf, BUF_SIZE);
				write(1, buf, len);
				close(fd1);
			}
		}
	}
}
라스코니의 이미지

fd1 = open(argv[1], O_RDONLY);에서 확실히 argv[1] 파일이 열리나요?

fd1 값을 검사해서 제대로 열리지 않았는지 확인해 보세요.

익명 사용자의 이미지

else /*3 ./mycat mycat.c*/
			{	
				fd1 = open(argv[1], O_RDONLY);
				if (fd1 < 0){
					printf("error\n");
				}
				len = read(fd1, buf, BUF_SIZE);
				write(1, buf, len);
				close(fd1);
			}

잘못 됐으면 error문이 떠야하는데 그런거 없이 똑같이 오류만 뜨네요..

익명 사용자의 이미지

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#define BUF_SIZE 1024
 
int main(int argc, char *argv[]){
	int fd1, fd2, len;
	long size;
	char buf[1024];
 
	fd1 = open(argv[1], O_RDONLY);
	if (fd1 < 0){
		printf("file open error\n");
	}
	len = read(fd1, buf, BUF_SIZE);
	write(1, buf, len);
	close(fd1);
}

이렇게 else안에 내용만 실행시키면 따로 실행은 잘 됩니다.
댓글 첨부 파일: 
첨부파일 크기
Image icon 캡처.PNG45.3 KB
라스코니의 이미지

디버그 해보시고 어느 라인에서 crash 되는지 확인해 보세요.
IDE를 쓰면 쉬운데 아니면 gdb라도 해보세요.

익명 사용자의 이미지

처음 써보는거라 이게 맞을까요?

댓글 첨부 파일: 
첨부파일 크기
Image icon 캡처.PNG46.34 KB
익명 사용자의 이미지

백트레쉬 정보는 이렇게 나오는데 제가 실행을 잘못시킨거 같기도 하네요..

댓글 첨부 파일: 
첨부파일 크기
Image icon 캡처.PNG59.83 KB
라스코니의 이미지

보통
gdb ./mycat .....
(gdb) b main
(gdb) step
이런식으로는 하는데 구글에 gdb 사용방법 구글링 해보세요.

아니면 eclipse, netbean, clion 같은 것을 깔아서 사용해 보세요. clion 강추합니다. 평가판으로 한달 사용가능합니다.

익명 사용자의 이미지

일단 gdb는 이런식으로 나오네요

clion은 방금 다운을 받기는 했는데 이것도 사용을 못해봐서 어떻게 사용을 해야할지도 모르겠네요 ㅠㅠ

댓글 첨부 파일: 
첨부파일 크기
Image icon 캡처.PNG14.65 KB
라스코니의 이미지

gdb 에서 아래와 같이 해야 할 겁니다.
b main
r
step (문제가 생길 때가지 계속 step, 어느 라인에서 오류가 생기는지 알기 위해서임)

clion 사용법은 쉬워요. 아무곳에나 압축풀고 /clion-2022xxxxx/bin/에 들어가신 후 ./clion.sh 치면 될 겁니다. 평가판을 선택하시면 되고요. 새 프로젝트 만들어서 코드 넣고 debug 하시면 되요.

익명 사용자의 이미지

문제 찾았습니다 ㅠㅠㅠㅠㅠㅠㅠㅠㅠ

./mycat mycat.c 를 넣을경우 argv[2] 값이 널이기 때문에 if(strcmp(argv[2], ">") == 0) 여기 구문에서

argv[2]에 값이 널인 즉 메모리를 할당받지 못한 값을 비교하려했기 때문에 세그먼트 오류가 발생했네요

./mycat mycat.c을 먼저 실행할 방법을 찾던가 아니면 null값일때 값을 할당 또는 추가해야 하는 방법을 찾아봐야 겠네요

익명 사용자의 이미지

if(strcmp(argv[2], ">") == 0) /*4 ./mycat mycat.c “>” out*/

여기 구문위에

if(argv[2] == NULL)
argv[2] = "<";
이거를 넣어주는걸로 해결했네요..

문제 찾는데 소중한 시간과 도움 주셔서 정말 감사합니다 ㅠㅠㅠㅠ

라스코니의 이미지

예. ㅎㅎ 원래 생각하신 그 위치가 아니었죠?!
디버그 기능을 잘 활용하시면 실력이 쭉쭉 올라갈 겁니다.

댓글 달기

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