일반 사용자가 ifconfig 명령어를 사용하면 command not found라고 나온다. 그건 현재 사용자의 경로명에 ifconfig 명령어가 들어있는 경로가 추가되지 않아서 일어나는 일. 즉, 경로 추가를 해줘야 한다. root 계정으로 ifconfig 하면 제대로 나온다고 함.. 안해봐서 모름
일단 ifconfig가 들어있는 위치를 찾는다
1. whereis ifconfig
결과값은 이런 식으로 나오고 sbin이란 디렉토리 밑에 ifconfig가 있으므로
2. echo $PATH
현재 사용자의 경로 확인을 해본다. 경로 확인을 했는데 ifconfig가 들어가 있는 디렉토리가 추가되어 있지 않다면 경로를 추가해야 한다.
프로그램 지정에서 디렉토리와 파일 이름이 합친 전체 이름으로 지정하는 것과 파일 이름만 지정하는 것의 차이는, execl()처럼 전체 이름을 요구하는 함수는 지정한 디렉토리의 프로그램을 실행하지만 execlp()함수처럼 프로그램 이름만 요구하는 함수는 현재 PATH 환경에 등록된 디렉토리를 있는 프로그램을 실행합니다.
즉,
execl()은 아래와 같이 프로그램이 들어 있는 디렉토리명까지 입력해 주어야 합니다.
execl( "/bin/ls", "/bin/ls", NULL);
아래와 같이 프로그래명만 입력하면 실행이 안 됩니다.
execl( "ls", "ls", NULL);
그러나 execlp()는 PATH에 등록된 모든 디렉토리에 있는 프로그램을 실행하므로 프로그램 이름만 입력해도 실행이 됩니다.
execlp( "ls", "ls", NULL);
다시 말씀 드려 man()함수의 인수준 *argv[]의 첫번째 문자열 argv[0]은 실행한 프로그램의 이름입니다.
int main( int argc, char *argv[])
{
printf( "%s\n", argv[0]);
return 0;
}
예로
]$ ./a.out
으로 실행했다면 argv[0]은 "./a.out"이 되며,
]$ /home/jwjw/prjs/test_fun/a.out
으로 실행했다면 argv[0]은 "/home/jwjw/prjs/test_fun/a.out"이 됩니다. 또한 어떤 프로그램은 이 첫번재 인수를 이용할 수 있으므로 파일의 전체 이름을 입력해 주는 것이 좋습니다.
파일을 사용하기 위해 열기(open)합니다. 파일 열기에는 표준 함수인 fopen()이 있습니다. fopen() 이 표준 C 라이브러리에서 제공한다면 open()은 리눅스에서 제공하는 함수로 더 자세한 내용은 포럼 강좌 게시판의 fopen() and open()글을 참고하여 주십시오.
파일을 open할 때에는 용도에 따라 읽기 전용, 쓰기 전용 또는 읽기와 쓰기가 모두 되는 옵션을 지정하여 열기를 합니다.
* 아래의 옵션은 모두 fcntl.h 에 정의되어 있습니다.
열기 옵션
옵션 설명
O_RDONLY
읽기 전용응로 열기
O_WRONLY
쓰기 전용으로 열기
O_RDWR
읽기와 쓰기가 모두 가능
이 외에도 더 다양한 옵션이 있습니다.
기타 옵션
옵션 설명
O_CREAT
해당 파일이 없으면 생성합니다.
O_CREATE 가 아니라 끝에 E가 없는 O_CREAT 입니다.
O_CREAT로 파일을 생성하게 된다면 파일의 접근권한을 지정하기 위해 접근 권한 값을 추가해야 합니다.
open( "jwmx", O_WRONLY | OCREAT, 0644);
O_EXCL
O_CREAT를 사용했을 때, 파일이 이미 있어도 열기가 가능하여 쓰기를 하면 이전 내용이 사라집니다.
O_CREAT를 사용할 때, O_EXCL를 함께 사용하면, 이미 파일이 있을 때에는 open() 되지 않아 이전 파일을 보존할 수 있습니다.
시스템 콜이란 리눅스 커널에 의해 제공되는 서비스이다. 예를 들어 파일에 쓰는 서비스를 이용하길 원한다면 프로그래머는 리눅스에서 제공하는 해당 시스템콜을 이용해서 프로그램을 작성한다. C를 이용해서 프로그래밍을 할경우 대부분의 시스템콜은 libc를 통한 포장(wrapper)함수형태로 제공받을 수 있다.
시스템 콜 함수에 대한 정보는 매뉴얼 페이지(man page)의 섹션 2번을 통해서 얻어올 수 있다. 예를 들어 read()시스템콜에 대한 정보를 얻기를 원한다면 man 2 read 하면 된다. 시스템콜에 대한 소개를 원한다면 man 2 intro를 이용하기 바란다.
# man 2 intro
시스템 콜을 사용하기 위해서 libc를 통한 포장함수를 호출하는 외에도 syscall()함수를 이용해서 직접 실행시키는 방법도 있다. 각각의 시스템콜은 고유한 번호를 가지고 있는데, syscall에 이 시스템 콜의 번호를 입력하는 방식으로 호출한다. 내부적으로 syscall은 0x80 인터럽트를 이용해서 커널에 명령을 전달한다.
시스템 콜함수들은 syscall.h 와 unistd.h 에 정의되어 있으며, 시스템 콜 테이블은 "arch/i386/kernel/entry.S"리눅스 커널 소스파일에 정의되어 있다.
2. 시스템 콜 예제
#include <syscall.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
int main()
{
long ID1, ID2;
// 시스템콜의 직접 사용
// 시스템콜 번호 : 20
ID1 = syscall(SYS_getpid);
printf("%ld\n", ID1);
// libc를 이용한 시스템 콜
// 시스템콜 번호 : 20
ID2 = getpid();
printf("%ld\n", ID2);
return (0);
}
3. 시스템 콜 레퍼런스
표 1. 시스템 콜 레퍼런스
번호
함수 이름
설명
소스
1
exit()
현재 프로세스의 종료
kernel/exit.c
2
fork()
자식 프로세스의 생성
arch/i385/kernel/process.c
3
read()
파일 지정자로 부터 읽기
fs/read_write.c
4
write()
파일 지정자로 쓰기
fs/read_write.c
5
open()
파일이나 장치열기
fs/open
6
close()
파일 지정자 닫기
fs/open.c
7
waitpid()
프로세스의 종료를 기다린다
kernel/exit.c
8
creat()
파일이나 장치의 생성
fs/open.c
9
link()
파일을 위한 새로운 이름 만들기
fs/namei.c
10
unlink()
파일 혹은 참조된 이름을 삭제한다
fs/namei.c
11
execv()
프로그램의 실행
arch/i386/kernel/process.c
12
chdir()
작업디렉토리의 변경
fs/open.c
13
time()
초단위의 시간 얻기
kernel/time.h
14
mknod()
일반 혹은 특수파일의 생성
fs/namei.c
15
chmod()
파일의 권한 바구기
fs/open.c
16
chown()
파일의 소유자 변경
fs/open.c
18
stat()
파일의 상태 얻기
fs/stat.c
19
lseek()
파일에서의 위치 변경
fs/read_write.c
20
getpid()
프로세스의 ID를 얻어온다
kernel/sched.c
21
mount()
파일 시스템의 마운트
fs/super.c
22
umount()
파일 시스템 마운트 해제
fs/super.c
23
setuid()
실제 유저 아이디 설정
kernel/sys.c
24
getuid()
실제 유저 아이디 얻어오기
kernel/sched.c
25
stime()
시스템의 시간과 날짜 설정
kernel/time.c
26
ptrace()
부모프로세스가 자식프로세스의 실행을 제어하도록 허가
arch/i386/kernel/ptrace.c
27
alarm()
실정시간후 alarm시그널이 전달되도록 한다.
kernel/sched.c
28
fstat()
파일 상태 얻기
fs/stat.c
29
pause()
시그널이 전달될때까지 대기한다.
arch/i386/kernel/sys_i386.c
30
utime()
파일의 엑세스시간과 수정시간을 수정한다.
fs/open.c
33
access()
파일의 권한을 검사한다.
fs/open.c
34
nice()
프로세스의 우선순위를 번경한다.
kernel/sched.c
36
sync()
슈퍼블럭을 업데이트 한다.
fs/buffer.c
37
kill()
프로세스에 시그널을 전송한다.
kernel/signal.h
38
rename()
파일의 이름과 위치를 변경한다.
fs/namei.c
39
mkdir()
디렉토리를 생성한다.
fs/namei.c
40
rmdir()
디렉토리를 제거한다.
fs/namei.c
41
dup()
열린 파일 지정자를 복사한다.
fs/fcntl.c
42
pipe()
내부통신을 위한 채널을 생성한다.
arch/i386/kernel/sys_i386.c
43
times()
프로세스 시간을 얻는다.
kernel/sys.c
45
brk()
프로세스의 데이터 세그먼트 크기를 변경한다.
mm/mmap.c
46
setgid()
real 그룹 아이디를 설정한다.
kernel/sys.c
47
getgid()
real 그룹 아이디를 얻어온다.
kernel/sched.c
48
sys_signal()
ANSI C 시그널 제어
kernel/signal.c
49
geteuid()
effective 유저 아이디 가져오기
kernel/sched.c
50
getegid()
effective 그룹 아이디 가져오기
kernel/sched.c
51
acct()
프로세스 측정을 켜거나 끈다.
kernel/acct.c
52
umount2()
파일시스템 unmount
fs/super.c
54
ioctl()
장치 제어
fs/ioctl.c
55
fcntl()
파일 제어
fs/fcntl.c
56
mpx
사용되지 않음
57
setpgid()
프로세스의 그룹 아이디 설정
kernel/sys.c
58
ulimit()
사용되지 않음
59
olduname
구식의 uname 시스템콜
arch/i386/kernel/sys_i386.c
60
umaks()
파일 마스크의 생성
kernel/sys.c
61
chroot()
루트디렉토리의 변경
fs/open.c
62
ustat()
파일시스템의 통계 얻기
fs/super.c
63
dup2()
파일 지정자 복사
fs/fcntl.c
64
getppid()
부모 프로세스의 PID 얻기
kernel/sched.c
65
getpgrp()
프로세스의 그룹 아이디 얻기
kernel/sys.c
66
setsid()
세션과 프로세스 그룹 아이디 설정
kernel/sys.c
67
sigaction()
POSIX 시그널 제어 함수
arch/i386/kernel/signal.c
68
sigmask()
ANSI C 시그널 제어
kernel/signal.c
69
ssetmask()
ANSI C 시그널 제어
kernel/signal.c
70
setreuid()
실제 혹은 유효사용자 아이디의 설정
kernel/sys.c
71
setregid()
실제 혹은 유효그룹 아이디의 설정
kernel/sys.c
72
sigsuspend()
시그널 마스크를 일시적으로 대체한후 시그널을 기다린다.
arch/i386/kernel/signal.c
73
sigpending()
시그널을 블럭하고 검사를 수행한다.
kernel/signal.c
74
sethostname()
호스트이름 설정
kernel/sys.c
75
setrlimit()
자원의 제한값을 설정한다.
kernel/sys.c
76
getrlimit()
자원의 제한값을 얻어온다.
kernel/sys.c
77
getrusage()
자원의 제한값을 얻어온다.
kernel/sys.c
78
gettimeofday()
날짜와 시간을 얻는다.
kernel/time.c
79
settimeofday()
날짜와 시간을 설정한다.
kernel/time.c
80
getgroups()
포함된 그룹아이디의 목록을 얻는다.
kernel/sys.c
81
setgroups()
포함될 르룹아이디의 목록을 설정한다.
kernel/sys.c
82
old_select()
오래된 버젼의 입출력다중화
arch/i386/kernel/sys_i386.c
83
symlink()
파일에 대한 심볼릭링크 생성
fs/namei.c
84
lstat()
파일의 상태 얻기
fs/stat.c
85
readlink()
심볼릭 링크의 연결된 파일 이름을 읽는다.
fs/stat.c
86
uselib()
공유라이브를 선택한다.
fs/exec.c
87
swapon()
파일과 장치의 스와핑을 시작한다.
mm/swapfile.c
88
reboot()
리붓 시키거나 Ctrl-Alt-Del을 활성화/비활성화 시킨다.
kernel/sys.c
89
old_readdir()
오래된 버젼의 디렉토리 내용읽기
fs/readdir.c
90
old_mmap()
오래된 버젼의 메모리 파일 대응
arch/i386/kernel/sys/i386.c
91
mnunmap()
메모리 페이지 해제
mm/mmap.c
92
truncate()
파일의 길이 결정
fs/open.c
93
ftruncate()
파일의 길이 결정
fs/open.c
94
fchmod()
파일의 권한 변경
fs/open.c
95
fchown()
파일의 그룹및 소유자 변경
fs/open.c
96
getpriority()
프로그램의 우선순위 얻어오기
kernel/sys.c
97
setpriority()
프로그램의 우선순위 설정
kernel/sys.c
98
profile()
execution time profile
99
statfs()
파일시스템 정보 얻기
fs/open.c
100
fstatfs()
파일시스템 정보 얻기
fs/open.c
101
ioperm()
set port input/output permissions
arch/i386/kernel/ioport.c
102
socketcall()
소켓 시스템콜
net/socket.c
103
syslog()
커널 메시지 버퍼의 내용을 읽거나 클리어한다.
kerne/printk.c
104
setitimer()
내부 타이머 설정
kernel/itimer.c
105
getitimer()
내부 타이머 값 가져오기
kernel/itimer.c
106
sys_newstat()
파일의 상태 얻기
fs/stat.c
107
sys_newlstat()
파일의 상태 얻기
fs/stat.c
108
sys_newfstat()
파일의 상태 얻기
fs/stat.c
109
olduname()
최근 커널의 정보얻기
arch/i386/kernel/sys_i386.c
110
iopl()
I/O privilege 레벨 변경
arch/i386/kernel/ioport.c
111
vhangup()
가상으로 현재 tty를 중지시킨다.
fs/open.c
112
idle()
0번 프로세스를 idel상태로 한다.
arch/i386/kernel/process.c
113
vm86old()
가상 8086모드로 들어가기
arch/i386/kernel/vm86.c
114
wait4()
프로세스의 종료를 기다린다. BSD 스타일
kernelk/exit.c
115
swapoff()
파일/장치의 스와핑 끝내기
mm/swapfile.c
116
sysinfo()
시스템의 정보 얻어오기
kernel/info.c
117
ipc()
System V IPC 시스템 콜
arch/i386/kernelk/sys_i386.c
118
fsync()
파일의 내부상태와 디스크상의 상태를 동기화 한다.
fs/buffer.c
119
sigreturn()
시그널 핸들러와 클린업 스택 프레임으로 부터 반환
arch/i386/kernel/signal.c
120
clone()
자식 프로세스의 생성
arch/i386/kernel/process.c
121
setdomainname()
도메인 이름 설정
kernel/sys.c
122
uname()
최근 커널의 정보 얻어오기
kernel/sys.c
123
modify_ldt()
ldt를 가져오거나 설정한다.
arch/i386/kernel/ldt.c
124
adjtmex()
커널 클럭을 조율한다.
kernel/time.c
125
mprotect()
메모리 영역에 대한 접근을 제어한다.
mm/mprotect.c
126
sigprocmask()
POSIX 시그널 제어 관련 함수
kernel/signal.c
127
create_module()
적재가능한 모듈엔트리 생성
kernel/module.c
128
init_module()
적재가능한 모듈 엔트리 초기화
kernelk/module.c
129
delete_module()
적재 모듈의 삭제
kernel/module.c
130
get_kernel_syms()
retrieve exported kernel and module symbols
kernel/module.c
131
quotactl()
디스크 쿼터 수정
fs/dquot.c
132
getpgid()
프로세스 그룹아이디 가져오기
kernel/sys.c
133
fchdir()
작업 디렉토리 변경
fs/open.c
134
bdflush()
start, flush, buffer-dirty-flush 데몬을 조정한다
fs/buffer.c
135
sysfs()
파일시스템 타입정보 가져오기
fs/super.c
136
personality()
프로세스 실행 도메인 설정
kernel/exec_domain.c
137
afs_syscall()
사용하지 않음
138
setfsuid()
파일 시스템 검사를 위해 사용되는 사용자 실별자를 설정
kernel/sys.c
139
setfsgid()
파일 시스템 검사를 위해 사용되는 그룹 식별자를 설정
140
sys_llseek()
읽기/쓰기 파일의 위치 이동
fs/read_write.c
141
getdents()
디렉토리 내용을 읽어들인다.
fs/readdir.c
142
select()
입출력 다중화
fs/select.c
143
flock()
열린파일에 대한 권고잠금 적용및 제거
fs/locks.c
144
msync()
메모리 맵과 파일의 동기화
mm/filemap.c
145
readv()
벡터를 읽는다
fs/read_write.c
146
writev()
벡터를 쓴다
fs/read_write.c
147
sys_getsid()
세션리더의 프로세스 아이디를 가져온다
kernel/sys.c
148
fdatasync()
파일의 디스크에 있는 in-core 데이터를 동기화
fs/buffer.c
149
sysctl()
시스템 파라메터를 읽고 쓴다
150
mlock()
메모리의 페이지 잠금
mm/mlock.c
151
munlock()
메모리의 페이지 잠금 풀기
mm/mlock.c
152
mlockall()
호출한 프로세스의 페이징을 금지시킨다
mm/mlock.c
153
munlockall()
호출한 프로세스에 대한 페이징을 다시 가능하도록 한다.
mm/mlock.c
154
sched_setparam()
스케줄 파라메터 설정
kernel/sched.c
155
sched_getparam()
스케쥴 파라메터 설정값 가져오기
kernel/sched.c
156
sched_setscheduler()
스케쥴 알고리즘 파라메터 설정
kernel/sched.c
157
sched_getscheduler()
스케쥴 알고리즘 파라메터 값 가져오기
kernel/sched.c
158
sched_yield()
kernel/sched.c
159
sched_get_priority_max()
정적 선행 범위를 가진다
kernel/sched.c
160
sched_get_priority_mix()
kernel/sched.c
161
sched_rr_get_interval()
프로세스의 SCHED_RR간격을 가져온다.
kernel/sched.c
162
nanosleep()
지정한 시간에 실행을 잠시 멈춘다
kernel/sched.c
163
mremap()
가상 메모리 주소를 재대응시킨다
mm/mremap.c
164
setresuid()
set real, effective and saved user or group ID
kernel/sys.c
165
getresuid()
get real, effective and saved user or group ID
kernel/sys.c
166
vm86()
8086가상 모드로 진입
arch/i386/kernel/vm86.c
167
query_module()
query the kernel for various bits pertaining to modules