所以,对于这个学校的项目,我试图让我的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);
}
}
答案 0 :(得分:2)
有两个原因导致您在“无效命令”代码中结束。
您不是在比较字符串。由于某种原因,command
是一个指针数组,char **
不是传递给strcmp()
的合法第一个参数。
您在命令字符串中包含换行符。这将导致您的所有strcmp()
函数调用失败,即使您修复了#1。
您的程序中还有其他逻辑错误:
在这一行:
if(buffer[i] != '\n' || buffer[i] || ' ' || buffer[i] != '\t'){
您可能希望第二个||
成为==
。
从stat_loc
打印waitpid(2)
返回值时,应使用手册页中列出的宏。在您的情况下,您似乎在寻找WEXITSTATUS(childValue)
。