'개발이야기'에 해당되는 글 26건

  1. C언어 pthread 사용 방법
  2. 두 절대경로에서 상대경로 구하기
  3. 우분투 아파치 서버로그 분석 (awstats)
  4. 안드로이드 ADB Shell 권한변경 (su)
  5. 이클립스에서 NDK 디버깅하기 3
  6. Ubuntu 이클립스 실행오류 해결 4
  7. Microsoft Visual C++ 2005 Service Pack 1 재배포 가능 패키지 설치 6
  8. Ubuntu 12.04에서 java 설치
  9. 포인터 배열 테스트 코드
  10. ptrace 설명 및 사용법

pthread를 이용하여 스레드를 구동하기 위해서는 pthread_create 함수를 사용합니다.


간혹 스레드를 사용하고 나서 스레드 종료시키는 것을 잊어 버리게 되는데요…
간단한 테스트 프로그램에서는 문제가 되지 않지만, 고객이 사용하는 프로그램이나 전문적인 프로그램에서는 프로그램이 종료 되기 전 반드시 스레드가 먼저 종료 되어야 합니다.


스레드가 동작 중일 때 프로그램이 먼저 종료 될 경우 에러나 예기치 않는 문제가 발생할 수 있기 때문입니다. 따라서, pthread_join 함수를 사용하여 생성된 스레드가 종료 될 때까지 기다리고 프로그램이 종료 되도록 구현합니다.


다음은 pthread 사용 방법 소스코드 입니다.

#include <pthread.h>
 
static pthread_t p_thread;
static int thr_id;
static bool thr_exit = true;
 
/**
 * 스레드 함수
 */
void *t_function(void *data)
{
	while(!thr_exit)
	{
		...
	}
 
	pthread_exit((void *) 0);
}
 
/**
 * 스레드 시작
 */
void start_thread()
{
	thr_exit = false;
	thr_id = pthread_create(&p_thread, NULL, t_function, NULL);
}
 
/**
 * 스레드 종료
 */
void end_thread()
{
	thr_exit = true;
	pthread_join(p_thread, (void**)NULL);	// 해당 스레드가 종료되길 기다린다.
}

/**
 * 메인 함수
 */
void main()
{
	start_thread();

	...

	end_thread();
}



references


'개발이야기 > C, C++' 카테고리의 다른 글

포인터 배열 테스트 코드  (0) 2012.08.07
C코드 메모리릭 잡기  (0) 2012.07.18
부모 클래스의 기본생성자가 없을때 메모리 누수 현상  (2) 2012.06.12
마방진 원리 및 문제  (4) 2012.05.19
Mangled Name  (0) 2012.05.13

두 절대경로에서 상대경로를 구하는 JAVA 코드입니다.

  • fromPath : C:\Windows\System32\drivers\etc
  • toPath : C:\Program Files
  • Result : ../../../../Program Files
/**
 * fromPath 절대경로에서 toPath 절대경로에 대한 상대경로를 반환
 * 
 * @param fromPath 절대경로
 * @param toPath 절대경로
 * @return 상대경로
 */
public static String makeRelativePath(String fromPath, String toPath) {
 
	if( fromPath == null || fromPath.isEmpty() ) 	return null;
	if( toPath == null || toPath.isEmpty() ) 		return null;
 
	StringBuilder relativePath = null;
 
	fromPath = fromPath.replaceAll("\\\\", "/"); 
	toPath = toPath.replaceAll("\\\\", "/");
 
	if (fromPath.equals(toPath) == true) {
 
	} else {
		String[] absoluteDirectories = fromPath.split("/");
		String[] relativeDirectories = toPath.split("/");
 
		//Get the shortest of the two paths
		int length = absoluteDirectories.length < relativeDirectories.length ? 
				absoluteDirectories.length : relativeDirectories.length;
 
		//Use to determine where in the loop we exited
		int lastCommonRoot = -1;
		int index;
 
		//Find common root
		for (index = 0; index < length; index++) {
			if (absoluteDirectories[index].equals(relativeDirectories[index])) {
				lastCommonRoot = index;
			} else {
				break;
				//If we didn't find a common prefix then throw
			}
		}
		if (lastCommonRoot != -1) {
			//Build up the relative path
			relativePath = new StringBuilder();
			//Add on the ..
			for (index = lastCommonRoot + 1; index < absoluteDirectories.length; index++) {
				if (absoluteDirectories[index].length() > 0) {
					relativePath.append("../");
				}
			}
			for (index = lastCommonRoot + 1; index < relativeDirectories.length - 1; index++) {
				relativePath.append(relativeDirectories[index] + "/");
			}
			relativePath.append(relativeDirectories[relativeDirectories.length - 1]);
		}
	} 
 
	return relativePath == null ? null : relativePath.toString();
}



references


서버(Server)를 아파치로 구축했다면 내 서버에

  • 몇명이 접속 했는지,
  • 어떤 페이지가 가장 호출되었는지,
  • 어느 국가에서 접속했는지,
  • 어떤 IP에서 접근했는지,
  • 머무른 시간은 어떠한지,
  • 어떤 파일을 다운로드 받았는지 등

수 많은 정보를 서버로그를 통해 다음과 같이 분석할 수 있습니다.


우분투환경에서 아파치 서버로그는 awstats를 이용하여 분석합니다.


1. awstats 패키지 설치
  • 다음 명령어로 awstats를 설치합니다.
  • geo 라이브러리는 방문자를 나라별로 분류해서 볼 수 있게 하기위해 설치합니다.
$ sudo apt-get install awstats libgeoip1 libgeoip-dev libgeo-ip-perl

2. awstats 환경 설정
$ sudo vim /etc/awstats/awstats.conf
  • 122번째줄 : LogFormat=4 를 LogFormat=1 로 변경. ubuntu apache 기본값이 1번입니다.
  • 153번째줄 : SiteDomain=”” 를 SiteDomain=”mydomain.com” 로 변경. 작업중인 파일명을 참고하여 변경하세요.
  • 168번째줄 : HostAliases=”localhost 127.0.0.1” 를 HostAliases=mydomain.com localhost 127.0.0.1” 로 변경. 현재 설정파일과 동일하게 취급할 도메인을 띄어쓰기를 구분자로 하여 적어줍니다.
  • 188번째줄 : DNSLookup=1 을 DNSLookup=0 으로 변경. dnslookup 은 부하가 많이 걸리므로 꺼두는게 좋습니다.
  • 905번째줄 : Lang=”auto” 를 Lang=”ko” 로 변경. 강제로 한국어를 지정합니다. awstats에는 한글UI를 지원합니다.
  • 1305번째줄 : LoadPlugin=”hashfiles” 를 LoadPlugin=”geoip GEOIP_STANDARD /usr/share/GeoIP/GeoIP.dat” 로 변경. 방문자를 나라별로 분류해서 볼 수 있습니다.

3. awstats 보안 설정
# awstats.도메인명.conf 를 자동으로 불러옴
$ sudo cp /etc/awstats/awstats.conf /etc/awstats/awstats.windwing.co.kr.conf

# 보안을 위해서 기본샘플파일인 awstats.conf 파일명을 awstats.conf_ 로 변경
$ sudo mv /etc/awstats/awstats.conf /etc/awstats/awstats.conf_

4. 아파치 환경 설정
  • 아파치 환경설정 파일을 읽어옵니다.
$ sudo vim /etc/apache2/sites-enabled/000-default
  • 환경설정 파일에서 VirtualHost 태그 안에 awstats 설정 추가합니다.
<VirtualHost *:80>
    ServerAdmin webmaster@localhost

    DocumentRoot /var/www

    <Directory />
        Options FollowSymLinks
        AllowOverride None
    </Directory>
    <Directory /var/www/>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride None
        Order allow,deny
        allow from all
    </Directory>


    ## -- awstats 설정 ##
    Alias /awstatsclasses "/usr/share/awstats/lib/"
    Alias /awstats-icon/ "/usr/share/awstats/icon/"
    Alias /awstatscss "/usr/share/doc/awstats/examples/css"

    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>

    ...
</VirtualHost>
  • 아파치 서버 재시작
$ sudo /etc/init.d/apache2 restart

5. 로그정보 업데이트
  • 시스템에서 주기적으로 업데이트 하기위해 crontab 설정합니다. (반드시 sudo를 붙여 관리자 crontab에 등록)
sudo crontab -e
  • 다음과같이 crontab에 awstats 업데이트 구문을 등록합니다. (30분 주기)
# awstats
00,30 * * * * /usr/lib/cgi-bin/awstats.pl -config=mydomain.com -update > /dev/null

6. 결과 확인



references


'개발이야기 > Linux' 카테고리의 다른 글

Ubuntu 이클립스 실행오류 해결  (4) 2012.09.26
Ubuntu 12.04에서 java 설치  (0) 2012.09.12
ptrace 설명 및 사용법  (0) 2012.07.19

안드로이드 폰을 루팅하였음에도 불구하고 커멘드에서 adb shell 을 입력하였을때 바로 su 권한을 얻지못하고 $표시로 나오는경우, 아래와 같은 방법으로 su 권한을 획득할 수 있다.

1. adb shell 

2. su  

3. mount -o remount,rw /system (or: adb remount)

4. ls -la /system/bin/sh
   lrwxr-xr-x root shell 2012-11-10 15:20 sh -> mksh  

5. chmod 4755 /system/bin/sh

6. ls -la /system/bin/mksh 
   -rwsr-xr-x root shell 157520 2012-11-10 09:54 mksh (notice the suid bit is set)  

7. ^D (exit) 

8. adb shell


su 권한을 획득하면 개발환경에서 프로그램의 빌드후 실행이나 adb install 명령어 설치등 제대로 동작하지 않는다.

따라서 이때는 su권한을 풀어주어야 한다.

1. adb shell

2. mount -o remount,rw /system (or: adb remount)

3. chmod 755 /system/bin/sh

4. ^D (exit)

5. adb shell


'개발이야기 > Android' 카테고리의 다른 글

이클립스에서 NDK 디버깅하기  (3) 2012.11.01
1. CDT 설치
The NDK plugin currently works with CDT 7.0.2 or CDT 8.0.2.
    1. Download Eclipse for Java.
    2. Install CDT from Eclipse update site http://download.eclipse.org/tools/cdt/releases/indigo. (indigo: 버전이름)
    3. Install Android SDK + NDK Plugins from Eclipse update site https://dl-ssl.google.com/android/eclipse/

2. NDK 플러그인 사용
1. First set the path to SDK and NDK:
    Eclipse -> Window -> Preferences -> Android -> set path to SDK
    Eclipse -> Window -> Preferences -> Android -> NDK -> set path to the NDK

2. Right click on an Android project and select `Android Tools -> Add native support`.
Note that you will not be able to add native support if the project already has C/C++ nature.

At this point, you will be able to build your applications using Project -> Build All.

3. NDK 디버깅
1. Update your build config to include NDK_DEBUG = 1.
    Right click project -> properties -> C/C++ Build:
2. Set a breakpoint in your C code. 3. Right click on your project, select Debug As -> Android Native Application Note: There is a delay of a few seconds between when the activity is launched and when native debugging starts. If your code is already executed by that point, then you won’t see the breakpoint being hit. So either put a breakpoint in code that is called repetitively, or make sure that you call JNI code after you see that ndk-gdb has connected.

4. 이클립스 환경설정
Eclipse -> Window -> Preferences -> C/C++ -> Code Analysis
Syntax and semantic Errors 체크 해제 (체크 해제 안할 경우 구문에러 인식하여 빌드되지 않습니다.)


참조: http://tools.android.com/recent/usingthendkplugin


'개발이야기 > Android' 카테고리의 다른 글

안드로이드 ADB Shell 권한변경 (su)  (0) 2013.01.02


Ubuntu 환경에서 이클립스를 설치하고 실행했더니 다음과 같은 오류가 발생하였습니다.

(An error has occurred. See the log file ...)


경고창에 적힌 See the log file 문구대로 로그파일을 gedit를 이용하여 읽어보았습니다.



로그 내용중 빨간 밑줄을 보시면 SWT library를 찾을 수 없다라고 나옵니다. (Could not load SWT library)

또한 /home/mooyou/.swt/lib/linux/x86_64/ 폴더에서 SWT library를 찾는 것을 볼 수 있습니다.

이것 때문에 문제가 발생한 것입니다.


따라서 다음과 같이 터미널에 입력하여 SWT library 파일들을 링크시켜주면 해결됩니다.

ln -s /usr/lib/jni/libswt-* ~/.swt/lib/linux/x86_64/


'개발이야기 > Linux' 카테고리의 다른 글

우분투 아파치 서버로그 분석 (awstats)  (0) 2014.03.01
Ubuntu 12.04에서 java 설치  (0) 2012.09.12
ptrace 설명 및 사용법  (0) 2012.07.19


Window7 환경에서 Visual C++ 2005 재배포 가능 패키지를 설치하려고 하였을때 다음과 같은 오류가 나타났다.

(Command line option syntax error. Type Command /? for Help.)


종래 해결 방법으로 설치 파일을 C:또는 D: 드라이브에 옮기고 나서 콘솔 창에서

"vcredist_x86.exe /t:c:temp" 와 같은 명령어를 사용하여 설치하려고 하였지만 이후에 창이 닫혀버리고

실제 설치되지 않는 문제가 발생하였다.


이곳 저곳으로 문제 해결점을 찾아보았지만, 딱히 해결 방법을 못찾아 다시 마소사이트에서 재배포 패키지를 검색해보니

Microsoft Visual C++ 2005 Service Pack 1 재배포 가능 패키지 MFC 보안 업데이트 버전이 있는것이 아닌가 !

(http://www.microsoft.com/ko-kr/download/details.aspx?id=26347)


MFC 보안 업데이트 버전으로 다운로드 받아 설치하였더니 경고창 없이 깨끗하게 설치되었고 적용도 잘 되었다 :)



Ubuntu 12.04 버전의 자바 설치는 구글에서 검색된 설치 방법으로는 권한? 문제로 설치가 잘 되지 않습니다.

찾아보니 다음과 같은 방법으로 해결을 할 수가 있습니다.

sudo apt-get purge openjdk*

sudo add-apt-repository ppa:webupd8team/java

sudo apt-get update

sudo apt-get install oracle-java7-installer


참조: http://ubuntu.or.kr/viewtopic.php?f=9&t=22516


'개발이야기 > Linux' 카테고리의 다른 글

우분투 아파치 서버로그 분석 (awstats)  (0) 2014.03.01
Ubuntu 이클립스 실행오류 해결  (4) 2012.09.26
ptrace 설명 및 사용법  (0) 2012.07.19


포인터 배열 관계에 있어서 햇갈리는 부분을 테스트 해보았다.

int* arr[3];


위와 같은 포인터 타입의 배열에서 의문을 품었다.

배열에서 새로운 객체(or 배열)의 생성이 자유로이 될까?

만약 배열이 생성가능하면 2차원 배열로써 활용가능할까?

에 해당하는 것이다.


  
int _tmain(int argc, _TCHAR* argv[])
{
	int a = 1;
	int b = 2;
	int c = 3;

	int* arr[3];

	arr[0] = new int[3];
	arr[1] = &b;
	arr[2] = &c;

	arr[0][0] = 4;
	arr[0][1] = 5;
	arr[0][2] = 6;

	printf("%d\n", arr[0][2]);
	printf("%d\n", *arr[1]);
	printf("%d\n", *arr[2]);

	return 0;
}

위의 코드는 정상 수행되는 코드로 결과 출력값은 다음과 같다.

※ 출력결과
6
2
3


즉, 배열에서 새로운 객체(or 배열)의 생성이 자유로이 되며,

포인터 배열에서 새로운 배열 할당시 2차원 배열로써 활용이 가능하다.

C와 C++ 알아나가면 알아나갈수록 유연하게 잘 설계되어 있는것 같다. ^^


'개발이야기 > C, C++' 카테고리의 다른 글

C언어 pthread 사용 방법  (0) 2014.03.05
C코드 메모리릭 잡기  (0) 2012.07.18
부모 클래스의 기본생성자가 없을때 메모리 누수 현상  (2) 2012.06.12
마방진 원리 및 문제  (4) 2012.05.19
Mangled Name  (0) 2012.05.13


ptrace는 리눅스 기반 생성된 프로세스가 어떻게 움직이며, 어떤식으로 데이타를 읽고 쓰는지, 

어떤에러를 내는지 추적을 하기위해 마련된 시스템 콜입니다.


이것은 주로 디버그를 위해 사용되며, 따라서 디버거는 일종의 ptrace명령어 묶음 유틸리티라고 보면 됩니다.

프로그래머는 디버거를 통해 ptrace를 손쉽게 사용할수 있으며, 

자신이 만든 프로그램이 어떻게 수행되는지 총괄적으로 관제할수 있습니다.


다음은 ptrace 설명 및 사용법을 잘 설명해주고 있는 사이트들입니다.

 ptrace 설명 (영문)  http://www.linuxmanpages.com/man2/ptrace.2.php
 ptrace 설명 (국문)  http://linux4u.kr/manpage/ptrace.2.html
 ptrace 설명 및 예제 (국문)  http://goo.gl/Gk9vs
 ptrace 메모리 덤프 (국문) http://xpack.tistory.com/119