Я писал простую оболочку в C для выполнения внешних команд, таких как command1 & command2
, и вот мой код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
static char line[1024];
char *and, *or, *col;
char *arg[1024];
static char* skipwhite(char* s)
{
while (isspace(*s)) ++s;
return s;
}
void run(char *cmd)
{
*and='\0';
int stat;
cmd= skipwhite(cmd);
char *next= strchr(cmd, ' ');
int i=0;
printf("%s \n", cmd);
while(next!=NULL)
{
*next='\0';
arg[i]=cmd;:
i++;
cmd= skipwhite(next+1);
next= strchr(cmd, ' ');
}
//arg[i]='\0';
int shmid = shmget(66, sizeof(int), IPC_CREAT | 0777);
int *status=(int *)shmat(shmid, NULL, 0);
*status=1;
int pid=fork();
if(pid==0)
{
int *v=(int *)shmat(shmid, NULL, 0);
if(execvp(arg[0], arg)==-1)
{
*v=0;
_exit(EXIT_FAILURE);
}
}
else
{
waitpid(pid, &stat, 0);
if(*status==0)
exit(0);
//printf("Trying to execute 2nd command\n");
cmd=and+1;
printf("%s \n", cmd);
and = strchr(cmd, '&');
if(and==NULL)
{
cmd= skipwhite(cmd);
next = strchr(cmd, ' ');
i=0;
while(next!=NULL)
{
*next='\0';
arg[i]=cmd;
i++;
cmd= skipwhite(next+1);
next= strchr(cmd, ' ');
}
arg[i]=cmd;
//arg[i+1]='\0';
if(execvp(arg[0], arg)==-1)
_exit(EXIT_FAILURE);
return;
}
else
run(cmd);
}
}
int main()
{
int status, pid;
printf("SIMPLE SHELL made by me. Type 'exit' or send EOF to exit.\n");
while(1)
{
printf("$> ");
fflush(NULL);
if(!fgets(line, 1024, stdin))
return 0;
char *cmds= line;
if(strcmp(cmds, "exit")==0)
exit(0);
and= strchr(cmds, '&');
or= strchr(cmds, '|');
col= strchr(cmds, ';');
if(and!=NULL)
{
pid=fork();
if(pid==0)
run(cmds);
else
waitpid(pid, &status, 0);
}
}
return 0;
}
Моя мотивация:
Всякий раз, когда оболочка получает внешняя команда, она разветвляется, говорит, что новый процесс равен 1, а команда - command1 & command2
. 1 снова разветвляется для выполнения command1 и command2. Если command1
успешно выполнен, то для command2
создается только новый процесс, иначе нет.
Проблема в том, что последняя команда никогда не выполняется, даже если она правильная. Я не могу понять проблему в коде.
Если требуется какая-либо информация, оставьте комментарий ниже.