Я сделал небольшую программу, которая разветвляется и выполняет другую программу. В основном он должен работать так же, как оболочка Unix.
Вот мой код:
int main(int argc, char *argv[]){
pid_t cpid;
char *shell[5];
shell[0]=argv[1];
shell[1]=argv[2];
shell[2]=argv[3];
shell[4]=NULL;
if(argc!=4){
printf("Program expects 4 arguments");
} else{
cpid=fork();
if(cpid==0){
execvp("/bin/sh",shell);
}//end child process
if (cpid != wait(NULL)) { /* parent code */
printf("Parent failed to wait");
return 1;
}
}//end else
}//end main
Однако, когда я даю команду
$ ./shell simple sml_prog1 A
он говорит sml_prog1 not found
примерно 15 или 20 раз.
Предполагается, что оболочка запускает simple
, который принимает sml_prog1 A
в качестве аргументов.
Программа работает сама по себе с теми же аргументами.
Я изменил разрешения sml_prog1
на read/write/executable
. Более того, sml_prog1
— это .txt
файл, содержащий данные, которые программа simple
использует
exit(1)
; работать? Там написаноincompatible implicit declaration of built-in function ‘exit’
В данный момент я включаю толькоstdio
unistd.h
иsys/types.h
08.10.2015exit()
вам нужноstdlib.h
. Дает ли приведенная выше команда список каталогов? Как выглядит результат? 08.10.2015total 40 drwxrwxrwt 2 lightdm lightdm 4096 Oct 8 04:36 at-spi2 drwx------ 2 ali ali 4096 Oct 8 04:36 keyring-nPZgUz drwx------ 2 ali ali 4096 Oct 8 04:36 pulse-1umMHHnYzsw3 drwx------ 2 lightdm lightdm 4096 Oct 8 04:37 pulse-2L9K88eMlGn7 drwx------ 2 root root 4096 Oct 8 04:35 pulse-PKdhtXMmr18n drwx------ 2 ali ali 4096 Oct 8 04:36 ssh-ZbTIeeCL2085 -rw-rw-r-- 1 lightdm lightdm 0 Oct 8 04:36 unity_support_test.0 drwx------ 2 ali ali 4096 Oct 8 04:36 vmware-ali drwxrwxrwt 2 root root 4096 Oct 8 04:35 VMwareDnD
08.10.2015ls -l /tmp
. Так что, похоже, это работает. Вызов вашей программы должен работать аналогичным образом. 08.10.2015execvp()
не работает, работаетperror("exec failed");
08.10.2015exec failed: (more descriptive message)
. 08.10.2015