Added kill builtin
This commit is contained in:
parent
97a08b7556
commit
b0604ae476
1 changed files with 84 additions and 1 deletions
85
sh.c
85
sh.c
|
@ -1,4 +1,4 @@
|
||||||
#define _POSIX_C_SOURCE 200809L
|
#define _XOPEN_SOURCE 700
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
@ -15,8 +15,10 @@
|
||||||
|
|
||||||
char** create_argv(char* command);
|
char** create_argv(char* command);
|
||||||
int get_argc(char* command);
|
int get_argc(char* command);
|
||||||
|
int get_argc_argv(char * argv[]);
|
||||||
char* prompt();
|
char* prompt();
|
||||||
int cd(char* path);
|
int cd(char* path);
|
||||||
|
int _kill(int argc, char * argv[]);
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
char** argv;
|
char** argv;
|
||||||
|
@ -37,6 +39,10 @@ int main() {
|
||||||
/* causes the fork to get skipped */
|
/* causes the fork to get skipped */
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
else if(strcmp(argv[0], "kill") == 0) {
|
||||||
|
_kill(get_argc_argv(argv), argv);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
else if(strcmp(argv[0], "exit") == 0 ||
|
else if(strcmp(argv[0], "exit") == 0 ||
|
||||||
strcmp(argv[0], "quit") == 0) {
|
strcmp(argv[0], "quit") == 0) {
|
||||||
exit(0);
|
exit(0);
|
||||||
|
@ -135,6 +141,83 @@ int get_argc(char* command) {
|
||||||
return argc;
|
return argc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int get_argc_argv(char * argv[]) {
|
||||||
|
int argc = 0;
|
||||||
|
while(argv[argc] != NULL) {
|
||||||
|
argc++;
|
||||||
|
}
|
||||||
|
return argc;
|
||||||
|
}
|
||||||
|
|
||||||
int cd(char* path) {
|
int cd(char* path) {
|
||||||
return chdir(path);
|
return chdir(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int get_signum(char * signame) {
|
||||||
|
if(strcmp(signame, "SIGHUP") == 0) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
else if(strcmp(signame, "SIGINT") == 0) {
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
else if(strcmp(signame, "SIGQUIT") == 0) {
|
||||||
|
return 3;
|
||||||
|
}
|
||||||
|
else if(strcmp(signame, "SIGABRT") == 0) {
|
||||||
|
return 6;
|
||||||
|
}
|
||||||
|
else if(strcmp(signame, "SIGKILL") == 0) {
|
||||||
|
return 9;
|
||||||
|
}
|
||||||
|
else if(strcmp(signame, "SIGALRM") == 0) {
|
||||||
|
return 14;
|
||||||
|
}
|
||||||
|
else if(strcmp(signame, "SIGTERM") == 0) {
|
||||||
|
return 15;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int _kill(int argc, char * argv[]) {
|
||||||
|
int signal = 0; pid_t pid; char c;
|
||||||
|
int write_signame = 0, error = 0;
|
||||||
|
|
||||||
|
while((c = getopt(argc, argv, "s:l")) != -1) {
|
||||||
|
switch(c) {
|
||||||
|
case 's': signal = get_signum(optarg); break;
|
||||||
|
case 'l': write_signame = 1; break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(signal == 0 && argv[1][0] == '-' && write_signame == 0) {
|
||||||
|
if(argv[1][1] >= '0' && argv[1][1] <= '9') {
|
||||||
|
signal = atoi((argv[1])+1);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
signal = get_signum((argv[1])+1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(write_signame) {
|
||||||
|
if(argc > 2) {
|
||||||
|
/* TODO: Figure out how to get exit status from $? */
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
printf("SIGHUP\n");
|
||||||
|
printf("SIGINT\n");
|
||||||
|
printf("SIGQUIT\n");
|
||||||
|
printf("SIGABRT\n");
|
||||||
|
printf("SIGKILL\n");
|
||||||
|
printf("SIGALRM\n");
|
||||||
|
printf("SIGTERM\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
for(int i = optind; i < argc && argv[i] != NULL; i++) {
|
||||||
|
pid = atoi(argv[optind]);
|
||||||
|
if(kill(pid, signal) != 0) {
|
||||||
|
error = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue