所以,对于学校的这个项目,我试图让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'){
你可能希望第二个
||
是一个==
。从
stat_loc
打印waitpid(2)
返回值时,应使用手册页中列出的宏。在你的例子中,你似乎在寻找WEXITSTATUS(childValue)
。