Я пытаюсь написать программу C, которая создает оболочку UNIX. В этой оболочке при вводе команды UNIX оболочка должна выполнять ее на переднем плане или в фоновом режиме (в фоновом режиме, когда указано &). Я получаю команду для запуска на переднем плане, но не могу запустить ее в фоновом режиме.
Вот мой код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#define MAX_LENGTH 1024
#define DELIMS " \t\r\n"
int main(int argc, char *argv[])
{
char *cmd, *bg;
char line[MAX_LENGTH];
pid_t fpid,bpid;
int status;
while (1)
{
fpid=10;
bpid=10;
printf("myshell > ");
if (!fgets(line, MAX_LENGTH, stdin))
break;
int j=0;
if(cmd = strtok(line, DELIMS))
{
bg = strtok(line," ");
while(bg!=NULL)
{
printf("%s",bg);
bg = strtok(NULL, " ");
if(strcmp(bg, "&") == 0)
break;
}
printf("%s", bg);
if(strcmp(cmd,"exit")==0)
break;
else if(strcmp(bg,"&")==0)
{
bpid=fork();
//waitpid(bpid,&status,0);
system(line);
exit(0);
}
else
{
//fpid=fork();
//if(fpid==0)
//{
system(line);
// exit(0);
//}
//else
//{
// waitpid(fpid,&status,0);
//}
}
}
}
return(0);
}
Этот код для моего домашнего задания.
fork.c
, то GCC 4.8.1 выдает такие ошибки, как:fork.c:33:20: error: incompatible types when assigning to type ‘char *[100]’ from type ‘char *’
наif(cmd = strtok(line, DELIMS))
иfork.c:46:21: warning: passing argument 1 of ‘strcmp’ from incompatible pointer type [enabled by default]
наif(strcmp(cmd,"exit")==0)
с примечанием/usr/include/string.h:87:6: note: expected ‘const char *’ but argument is of type ‘char **’
int strcmp(const char *, const char *);
- person Jonathan Leffler   schedule 21.09.2013strtok()
иstrtok_r()
обе уничтожают строку ввода, что является одной из причин, по которой они не подходят для использования в разборе командной строки оболочки. В вашем коде различные символы, такие как фон&
, должны быть отделены от слова до (и после) пробелами, что не требуется для обычных оболочек. Это не должно быть непреодолимым для самодельной оболочки, но не будет работать с POSIX-совместимой оболочкой. Посколькуstrtok()
обрезает строку, вы не можете использовать строку вsystem()
впоследствии, потому что там остается только первое слово (это будет нормально дляls
, но не дляls -l
). - person Jonathan Leffler   schedule 21.09.2013