Я хочу создать программу msh, которая будет распознавать некоторые другие написанные мной программы на C, создавать новый процесс для этой программы на C и запускать ее.
Например, я уже написал свои собственные функции копирования, перемещения и удаления с именами mycopy, myremove и mymove.
Я хочу иметь возможность сделать ./msh mycopy file1 file2 И заставить msh создать новый процесс, запустить mycopy и выполнить действие, а перед выходом дождаться завершения этого дочернего процесса.
Я попробовал то, что вы видите ниже, и он компилируется, но, похоже, не выполняет задачи. Какие-либо предложения? Я никогда раньше не использовал fork(), execl() или wait(), поэтому, возможно, я пропустил и включил или параметр, пожалуйста, поправьте меня, если я ошибаюсь.
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <string.h>
int main(int argc, char* argv[]){
int pid;
if(strcmp(argv[1], "mycopy") == 0){
if(pid = fork() == 0){
execl("/home/1234/mycopy", argv[2], argv[3]);
}
}
if(strcmp(argv[1], "myremove") == 0){
if(pid = fork() == 0){
execl("/home/1234/myremove", argv[2]);
}
}
if(strcmp(argv[1], "mymove") == 0){
if(pid = fork() == 0){
execl("/home/1234/mymove", argv[2], argv[3]);
}
}
if(pid > 0){
wait((int*)0);
}
return 0;
}
Я пробовал это и работал 3, напечатанный дважды. Означает ли это, что моя команда execl не работает, и если да, то как мне ее исправить, поскольку argv[2] и argv[3] необходимо передать в ./mycopy
int pid = fork();
if(strcmp(argv[1], "mycopy") == 0){
if(pid == 0){
printf("WORKING1");
execl("/home/1234/mycopy", argv[2], argv[3]);
printf("WORKING2");
}
}
wait((int*)0);
printf("WORKING3");
return 0;
strcmp
, вы не можете сравнивать строки, используя==
в C - person TheQAGuy   schedule 19.11.2015strcmp
, вам нужно добавить#include<string.h>
- person TheQAGuy   schedule 19.11.2015argc >= 2
, 2) Добавьтеfprintf(stderr, "I got this far\n")
отладочных stmts в основную и дочернюю программы, чтобы увидеть, как далеко они продвинулись, 3) Добавьтеfprintf(stderr, "pid=%d\n, pid)
отладочных stmts - person paulsm4   schedule 19.11.2015execl()
— это функция с переменным числом аргументов, что означает, что она принимает столько аргументов, сколько вы ей указываете, как иprintf()
. Первым аргументомexecl()
является имя загружаемого исполняемого файла, а его второй аргумент становится первым аргументом (argv[0]
) нового процесса. - person Darwin von Corax   schedule 19.11.2015fork()
, чтобы выяснить, было ли оно дочерним или родительским, поэтому ответы, указывающие на это, теперь не синхронизированы с вопросом. Вопрос уже малопонятен. У него просто есть ошибка, когда список аргументов не завершается NULL доexecl
. Прочтите справочную страницу. - person Peter Cordes   schedule 19.11.2015wait()
ing для дочернего элемента. - person Peter Cordes   schedule 19.11.2015