UNIX/Linux C Programming 실습

<차 례>

0. What is the computer?

1. Introduction to C & Unix/Linux

2. Starting to C programming

3. Telnet & Editor

4. UNIX/Linux C programming 예제

0. What is the computer?

• The History of the Computer

- “이제까지 고안된 것 가운데 가장 강력하고 정확한 컴퓨터 ‘매니악’은 미국이 수소폭탄개발 경쟁에서 소련을 이기도록 도왔고, 현대 컴퓨터 시대를 여는 데 선구적인 역할을 했다. (The most powerful and accurate computer ever designed to that point, ‘MANIAC’ helped the United States beat Soviet Union in the race for the hydrogen bomb in 1952 and was a forerunner of the modern computer age.)" <www.sciencetimes.co.kr>

• Computer: HW +SW

앨런튜링(Alan Turing, 1912~1954)

문제

생각

문제해결방법

소프트웨어

하드웨어

1. Introduction to C/Unix/Linux

• 벨 연구소의 릿치(Ritchie)가 어셈블리어로 작성된 UNIX를 고급어로 고쳐 쓰기 위해 고안한 언어(1972): NB(Next to B)라고 불리기도 했다.

- 기존의 C 언어를 표준화하기 위해 ANSI C 공표(1989)

- 시스템 기술용 언어 -> 범용 프로그래밍 언어로 발전(C->ANSI C -> C++/C#)

- C 의 특징

① 이식하기 편리한 언어

② 범용 목적 언어

③ 프로그램 이해가 쉽다(top-down design, structured programming, 모듈화된 프로그래밍 지원)

④ 융통성(다양한 제어구조와 자료구조, 풍부한 연산자 제공)

⑤ 강력(개발 시스템의 실행 속도)

⑥ 중간수준 언어(고급언어와 어셈블리 언어의 장점만 취함)

https://en.wikipedia.org/wiki/Dennis_Ritchie

• A History of Unix

https://en.wikipedia.org/wiki/Unix

U.C. at Berkeley			3BSD (Berkeley S/W Distrib.) -Demand paging for virtual memory	4.1 BSD -Supported by DARPA -정부가 이용하기 위한 표준 Unix		4.2 BSD -TCP/IP Net. S/W	4.3 BSD -판매용
Bell Lab. in AT&T	Version 1 -K. Tompson and D. Ritchie -Multics at MIT -PDP-7/PDP-11 의 OS (16-bit Mini Computer)	Version 3 -Written in C	Version 7 -VAX에 이식
USG(Unix Support Group) in AT&T					Sys. Ⅲ -종합판 -real-time 기능 추가	Sys. Ⅴ -판매용
	1969		1978	1979	1982	1983

• Unix source code (from 4.3 BSD and System V) + 각 회사의 추가 기능.

- Ultrix by DEC for VAX ⇒ Digital Unix로 발전.

- Xenix by MS for Intel 8088

- Solaris by SUN

- HP-UX by HP

- AIX by IBM

- Linux (for Intel processors) by Linus Torvalds: 여러 제품들

e.g., Redhat, Ubuntu, Fedora, CentOS

https://en.wikipedia.org/wiki/Linux

- Android by Andy Rubin (Google) ⇒ Linux kernel

https://en.wikipedia.org/wiki/Android_(operating_system)

• 서버용 O/S: 여러 사용자가 "동시에" 사용하는 computer에서 사용하는 O/S

⇒ 'Multiprocess' OS

① Authorization: login 절차 - 인증

② Process management

- Time sharing, CPU scheduling

- Concurrency control: mutual exclusion/synchronization, deadlock, IPC

③ Memory management: virtual memory, paging, swapping

④ Storage management

- File system: allocation, protection

- Disk scheduling

⑤ Network management

- LAN/WAN connection

- Protocols: TCP/IP, IPX/SPX, NetBEUI, HTTP 등

- Applications: E-mail, ftp, telnet, Web, DB 등

⇒ 가장 많이 사용하는 Network Application SW?

DB

DBMS

• Unix/Linux 실습

- login & 명령문: 프로그램 > 시스템도구> 터미널

* Remote login: Telnet tools - NetTerm/새롬 데이터맨 프로/putty 등

- 편집/Edit: vi, gedit (한글입력 ctrl(shift) + space), nano

- 기본 command: pwd, ls, more, cat, man, cd, cp, mv, rm, mkdir, rmdir, ps, logout(exit), |, >, <

- Program command: cc(C compiler & linker), CC(C++ compiler & linker), gcc, javac(Java compiler), java(Java interpreter)

- Network command: mail, ftp, telnet, write, talk

- WWW: Apache server, IIS

⇒ 간결성, 성능 중시

⇒ Not User-Friendly Interface

⇒ Text User Interface (Not GUI)

ex) 1 +2 + … + n = ?

/* sample1.c */

#include <stdio.h>

int main(void)

{

int sum=0;

int i, num;

printf("n을 입력하세요:“);

scanf("%d", &num);

for(i=1; i<=num; i++)

sum=sum + i;

printf("1부터 %d까지의 합: %d∖n", num, sum);

return 0;

}

• Programming Language 계보

http://en.wikipedia.org/wiki/Smalltalk

http://en.wikipedia.org/wiki/Xerox_Palo_Alto_Research_Center

http://en.wikipedia.org/wiki/Macintosh

2. Starting to C programming

• 프로그래밍 4 단계

① editing

② compiling : object file 생성

③ linking : binary (executable) file 생성

④ executing

- 통합개발환경(IDE, Intergrated Development Environment): 프로그램 개발자가 이용하    는 개발 프로그램. 편집기능/컴파일&링크/실행 환경을 모두 제공하는 도구(tool) 프로그램

e.g., Visual C++, Visual Basic, Delphi, Powerbuilder, Eclipse 등

• How to make a C program in Unix/Linux

․터미널 실행 (프로그램 > 시스템도구 > 터미널)

① edit : 문서 편집기 vi 이용($vi ex.c)/ gedit 사용 ($gedit)

② compiling : Unix C 컴파일러 이용($cc ex.c)/ Linux C 컴파일러 사용($gcc ex.c)

③ linking : 컴파일시 자동 실행 -> a.out 생성됨(default)

cf.) $cc ex.c -o ex  / $gcc ex.c -o ex → 실행파일(binary file) ‘ex’ 생성

④ executing : binary file(a.out) 실행시킴

3. Telnet, FTP & VI Editor

• Telnet

① UNIX 의 shell 모드를 원격 터미널에서 흉내내기 위한 service protocol

② TCP 세션을 통해 연결

③ 공개용 프로그램 : NetTerm, 데이터맨프로, 이야기, telnet(Windows), putty 등

④ Telnet 연결 : comedudb.knue.ac.kr/comedudb4.knue.ac.kr (Linux)

⑤ Telnet ID/PWD : test01～test30

• FTP

① Telnet과 동일한 ID/PWD로 접근 가능

② 편집기로 프로그램을 미리 작성한 후 FTP를 통해 UNIX에 전송한 후 컴파일 및 실행

• vi Editor : UNIX에서 사용되는 표준 텍스트 편집기

① 명령모드 : 편집을 위한 명령의 입력이 가능한 상태로 초기 상태

② 입력모드 : 텍스트를 입력할 수 있는 상태

- 명령모드→입력모드

① i(insert) : 텍스트가 커서 앞에서 삽입된다.

② a(append) : 텍스트가 커서 뒤에서 삽입된다.

- 입력모드→명령모드 : Esc

- 명령모드에서의 커서 이동 : 커서이동키 사용/h, j, k, l

- 편집 명령

① x 현재 커서위치의 글자 지우기

② dd 현재 커서 위치의 한 행 모두 지우기

③ yy 현재 커서 위치의 한 행 복사해 놓기

④ p 삭제되거나 복사된 행 붙이기

- 파일저장

① :q 수정이 안되었을 때 종료 - 수정되었을 때에는 종료 불가

② :q! 저장하지 않고 무조건 종료

③ :w 파일명  정해진 파일명으로 저장

④ :wq 현재의 파일 이름으로 저장하고 종료

• nano Editor : Linux에서 사용되는 텍스트 편집기

• server에서 telnet과 vi Editor를 통해 프로그래밍하기 어려울 때

→ 윈도우에서 원시(source) 프로그램을 작성하고, 작성한 파일을 FTP를 통해 전송.

e.g., ① EditPlus (client/UTF-8으로 저장)

② AlFTP (client→server 전송)

③ Putty (server/UTF-8으로 보기)

4. Program Design Form

Input Data/ (Structure)
Output Data/ (Structure)
Local Data/ (Structure)
Algorithm	순서도/pseudo-code

• 순서도(Flow-chart)

5. UNIX C programming 예제

• 간단한 프로그램의 구조

① 프로그램은 하나 이상의 함수(function)로 구성: Function-based language

⇔ Object-oriented language

② 이 중 시작은 반드시 main()이라는 함수어야 함.

⇒ main() { f1(); f2(); … fn(); }

③ 함수는 머리(header)와 본체(body)로 이루어짐

• 출력 data

- 줄바꿈

/* sample2.c */

#include <stdio.h>

int main (void) /* 함수의 이름 */

{

int num;

num = 1;

printf("I am a simple");

printf("computer. \n");

printf("My favorite number is %d because it is first.\n", num);

}

e.g., # find /usr -name stdio.h -print

/usr/share/splint/lib/stdio.h

/usr/include/bits/stdio.h

/usr/include/stdio.h                       // # more /usr/include/stdio.h

/usr/include/isc/stdio.h

/usr/lib/bcc/include/stdio.h

/usr/lib/i386-redhat-linux7/include/bits/stdio.h

/usr/lib/i386-redhat-linux7/include/stdio.h

• 확장문자: 특수한 작업들/기호들

- [부록 5]  p.691

- [C 콘서트]  p.105

• printf()의 형식(format) 지정자

- [부록 5]  p.692

변환지정자	변환 작용	인수형
%d	인수를 10 진수로 변환	정수형
%o	인수를 8 진수로 변환	정수형
%x	인수를 16 진수로 변환	정수형
%u	인수를 부호없는 10 진수로		정수형
%c	인수를 문자로 출력	문자형
%s	인수를 문자열로 출력(NULL 앞까지 또는 지시된 문자 수만큼)	문자열
%f	인수를 10 진수 실수	부동소수점형
%e	인수를 10 진수 지수형	부동소수점형
%g	%f 나 %e 의 변환 중 문자수가 적은 쪽으로	부동소수점형

%d	65
%o	101
%x	41
%c	A
%f	?? (의미없음)
.jpg / .mp4	사진/동영상

0 1 0 0 0 0 0 1

- [C 콘서트] p.79

e.g., 피보나치 수열

(https://en.wikipedia.org/wiki/Fibonacci_number)

fiboint.c (정수형)

#include<stdio.h>

int main()

{

int n, i;

int first=0, second=1, next;

printf("Enter the number of terms∖n");

scanf("%d", &n);

printf("First %d terms of Fibonacci series are : ∖n", n);

for ( i = 0 ; i < n ; i++ )

{

if ( i <= 1 )

next = i;

else

{

next=first+second;

first=second;

second=next;

}

printf("%d∖n", next);

}

return 0;

}

fibodbl.c (실수형)

• 정수형 출력 형식: short, int, long → %d

- [부록 5]  p.693

• 실수형 출력: float, double  → %f

- [부록 5]  p.694

• 문자형 출력: char  → %c

문자열 출력: 배열(array) → %s

- [부록 5]  p.695

• 진법(base) 출력: int, long → %o, %x, %X

- [부록 5]  p.696

• 주소(address) 출력: int, long, float, double, char → %p, %u

- [부록 5]  p.696

http://comedudb6.knue.ac.kr/tykim/Myhome/Cnote/0C-format.pdf

입력 data: scanf()

• 입력 data를 변수에 저장: 주소(&) 지정

/* sample6.c */

#include <stdio.h>

main()

{

int a, b, c;

printf("숫자 두 개를 입력하시오: ");

scanf("%d %d", &a, &b);

c=a+b-2;

printf("결과: %d + %d - 2 = %d\n", a, b, c);

}

- 입력형식 지정자: [부록 5] p.697 - p.698

• 실행초기 입력 데이터

- Note: C Background

/* sample7.c */

#include <stdio.h>

int main(argc, argv)

int argc;

char *argv[];

{

printf("인수의 갯수: %d\n", argc);

printf("인수 #0: %s\n", argv[0]);

printf("인수 #1: %s\n", argv[1]);

printf("인수 #2: %s\n", argv[2]);

printf("인수 #3: %s\n", argv[3]);

return 0;

}

$ echo hello world ↲

↗   ↑    ↖

argv[0]  argv[1]  argv[2]

argv

argv[0]

argv[1]

argv[2]

"echo\0"

"hello\0"

"world\0"

• C에서 제공하는 I/O 방법들

① Line: scanf(), printf(), ...

② Screen I/O: scanw(), printw(), ...

③ File: fscanf(), fprintf(), ...

④ Argument(인수): main(argc, argv)

e.g. more test.c