我是新尝试学习fork()和系统调用的功能,现在我正在使用execvp()尝试进行bash,但我遇到的问题是当我编写正确的命令时,程序结束,我想循环使用我的bash,直到该人在我的命令行中写“退出”。 我使用的代码是:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <string.h>
int main()
{
char cadena[100];
char *array[100];
char *ptr;
int i=1;
pid_t pid;
pid = fork();
if (pid < 0) {
perror("Error en la llamada a fork().");
return -1;
}
else if (pid == 0) {
do {
printf("prompt$ ");
fgets(cadena, 100, stdin);
ptr = strtok(cadena, " \n");
array[0] = ptr;
while( (ptr = strtok( NULL, " \n" )) != NULL ){
array[i] = ptr;
i++;
}
array[i]=NULL;
execvp(array[0],array);
perror("Execvp failed");
} while(array[0] != "exit");
}
else {
wait(NULL);
}
return 0;
}
我正在使用迭代结构do-while尝试循环,但它没有用,因为当我写一个正确的突击队员程序结束时,我需要继续写突击队因为我需要做一个列表与程序结束后我写的所有命令。
答案 0 :(得分:1)
你功能的这个特殊部分没有按照你的意愿行事:
}while(array[0] != "exit");
您需要使用strcmp()
,如下所示:
} while (strcmp(array[0], "exit"));
...注意如果两个args相等,则来自strcmp()
的返回值为0,所以当a = = b条件为真且循环继续时。
答案 1 :(得分:1)
您遇到了一般性设计问题:除非出现调用错误,否则exec
函数都不会返回调用者。 shell的常见设计是伪代码:
loop
prompt for a command
read a command line
parse the command line
if exit
then exit loop
else
fork (a child to execute the command, detailed below)
if pid is 0 (child)
then exec command
else
wait for the child to end