[英]Making custom shell in C. Fork()
因此,对于这个用于学校的项目,我正在尝试让我的Shell执行基本的fork()命令,但是,我提供给我的代码的输入似乎无效。
当我在命令行中输入fork()时,程序将执行无效的输入部分。
我究竟做错了什么? 既然这是一个学校项目,那么我想指出的方向是正确的,而不是仅仅给出答案,如果这很酷。 =)
#include <stdio.h>
#include <stdlib.h>
#define MAX_NUM_ARGS 256
#define SIZE 256
void orders(char *command[SIZE]);
int main() {
int pid = 0;
int pid2 = 0;
int childvalue =0;
char buffer[SIZE]= "";
//char input_args[MAX_NUM_ARGS];
char **input_args = NULL;
int i = 0;// counting variable
printf("Welcome to my shell.\n");
while(1){
//initialize array of strings
//first free any prevously allocated memory
if (input_args != NULL)
{ //memory has been allocated free it
for (i = 0; i <MAX_NUM_ARGS; i++)
{
free(input_args[i]);
}
}
//free array of strings
free(input_args);
//new allocate memory
input_args = (char**) malloc(sizeof(char*) * MAX_NUM_ARGS);
//check return value for error
if (input_args == NULL)
{
printf("We are out of memory. =(\n");
continue;
//print error: out of memory, exit with a error coce
}
//allocate memory for each string
for (i = 0; i <MAX_NUM_ARGS; i++)
{
input_args[i]= (char*)malloc(sizeof(char) * MAX_NUM_ARGS);
if(input_args[i] == NULL)
{//error
printf("Error, the input is empty.");
continue;
}
}
printf("~$: "); //prompts the user for input
fgets(buffer, sizeof(buffer), stdin);
//if the user types in exit, quit
if (strcmp(buffer, "exit\n") == 0){
break;
}
//if user types in clear, wipe the screen and repeat the lop
else if(strcmp(buffer, "clear\n")==0){
system("clear");
continue;
}
//should the user punch in nothing, repeat the loop
else if (strcmp(buffer, "\n") == 0) {
continue;
}
for (i = 0; i < SIZE; i++) {
if(buffer[i] != '\n' || buffer[i] || ' ' || buffer[i] != '\t'){
input_args[0][i] = buffer[i];
}
}
//if the input doesn't fall under the conditionals above, execute orders.
orders(input_args);
} //end of while loop
return 0;
}//end of main function
void orders(char *command[SIZE]){
//handles the commands of the shell
int pid =0;
int pid2 = 0;
int childValue = 0;
if (strcmp(command, "fork()")== 0){
pid = fork();//forks the process for the first time
if (pid != 0){
printf("I'm the parent, waiting on the child.\n");
pid = waitpid(-1, &childValue,0);
printf("Child %d returned a value of %x in hex.\n", pid, childValue);
return;//return backs to the main prompt
}
else{
printf("I am the first child.\n");
exit(2);//exits this process?
}
}
//clears the screen
else if(strcmp(command, "clear")==0){
system("clear");
}
else{//command outputted when you punch in a bad answer
printf("Invalid command, %s.?\n", *command);
}
}
您以“无效命令”代码结尾的原因有两个。
您没有在比较字符串。 由于某种原因, command
是一个指针数组,而char **
不是传递给strcmp()
的合法第一个参数。
您在命令字符串中包含换行符。 这将导致所有strcmp()
函数调用失败,即使您修复了#1也是如此。
您的程序中还存在其他逻辑错误:
在这一行:
if(buffer[i] != '\\n' || buffer[i] || ' ' || buffer[i] != '\\t'){
您可能需要第二个||
成为==
。
从waitpid(2)
打印stat_loc
返回值时,应使用手册页中列出的宏。 在您的情况下,似乎您正在寻找WEXITSTATUS(childValue)
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.