728x90
728x170
쉘(Shell) 프로그램 구현 (execl(), execlp() 사용)
리눅스에서 C 언어의 `execl()`, `execlp()` 함수를 사용하여 쉘 프로그램을 구현할 수 있다.
■ `execl()`, 함수를 사용하여 쉘 프로그램 구현하기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/wait.h>
#include <sys/types.h>
#define MAXLINE 64
int main(int argc, char **argv) {
char buf[MAXLINE];
pid_t pid;
printf("TestShell ver 1.0\n");
while (1) {
memset(buf, 0x00, MAXLINE);
fgets(buf, MAXLINE - 1, stdin);
// char *fgets (char *string, int n, FILE *stream)
if (strncmp(buf, "exit\n", 5) == 0) {
break;
}
buf[strlen(buf) - 1] = 0x00; // Remove Keyboard Input(Enter)
pid = fork();
if (pid == 0) {
if (execl(buf, buf, NULL) == -1) {
printf("Command Execution is failed\n");
exit(0);
}
}
if (pid > 0) {
wait(NULL);
}
}
return 0;
}
|
- 콘솔에서 확인하기
ubuntu@ip-172-xx-xx-90:~/test/ForkExeclWaitProgram$ vim ShellTest.c
ubuntu@ip-172-xx-xx-90:~/test/ForkExeclWaitProgram$ gcc ShellTest.c -o ShellTest
ubuntu@ip-172-xx-xx-90:~/test/ForkExeclWaitProgram$ ./ShellTest
|
TestShell ver 1.0
ls
Command Execution is failed
/bin/ls
FEWProgram ShellTest.c execltest.c execvetest.c forktest
ShellTest execltest execvetest forkexeclwaitProgram.c forktest.c
exit
|
- `execl()` 함수의 특성상 `/bin/ls` 경로를 붙여야 명령어를 수행할 수 있다.
■ `execlp()`, 함수를 사용하여 쉘 프로그램 구현하기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/wait.h>
#include <sys/types.h>
#define MAXLINE 64
int main(int argc, char **argv) {
char buf[MAXLINE];
pid_t pid;
printf("TestShell ver 1.1\n");
while (1) {
memset(buf, 0x00, MAXLINE);
fgets(buf, MAXLINE - 1, stdin);
// char *fgets (char *string, int n, FILE *stream)
if (strncmp(buf, "exit\n", 5) == 0) {
break;
}
buf[strlen(buf) - 1] = 0x00; // Remove Keyboard Input(Enter)
pid = fork();
if (pid == 0) {
if (execlp(buf, buf, NULL) == -1) { // execl() -> execlp()
printf("Command Execution is failed\n");
exit(0);
}
}
if (pid > 0) {
wait(NULL);
}
}
return 0;
}
|
- 콘솔에서 확인하기
ubuntu@ip-172-xx-xx-90:~/test/ForkExeclWaitProgram$ vim ShellTest.c
ubuntu@ip-172-xx-xx-90:~/test/ForkExeclWaitProgram$ gcc ShellTest.c -o ShellTest
ubuntu@ip-172-xx-xx-90:~/test/ForkExeclWaitProgram$ ./ShellTest
|
TestShell ver 1.1
ls
FEWProgram ShellTest.c ShellTest2.c execltest.c execvetest.c forktest
ShellTest ShellTest2 execltest execvetest forkexeclwaitProgram.c forktest.c
/bin/ls
FEWProgram ShellTest.c ShellTest2.c execltest.c execvetest.c forktest
ShellTest ShellTest2 execltest execvetest forkexeclwaitProgram.c forktest.c
exit
|
- `execlp()` 함수로 인하여 `/bin/ls` 경로를 붙이지 않아도 명령어를 수행할 수 있다.
728x90
그리드형(광고전용)
'System Software > Linux' 카테고리의 다른 글
[리눅스 명령어] useradd / useradd -D (0) | 2022.02.28 |
---|---|
Google Cloud Platform(GCP) 무료로 사용하기 (Compute Engine) (0) | 2021.11.10 |
cat 과 리다이렉션(Redirection) (0) | 2021.03.09 |
[CentOS] 부팅 모드 변경 방법 (GUI/TEXT) (0) | 2021.02.11 |
vim 설정 변경하는 방법 (탭 공백 4칸으로 바꾸기) (0) | 2020.08.29 |
XShell 또는 PuTTY를 이용하여 AWS EC2 Ubuntu Server에 연결하기 (0) | 2020.08.20 |
우분투 su: Authentication failure 오류 해결 방법 (0) | 2020.05.05 |
리눅스 gcc 명령어 (0) | 2020.03.27 |