У меня возникли проблемы с попыткой выполнить процесс с использованием fork()
и execvp()
. У меня есть Pcb
-структуру, которая имеет массив аргументов (args
):fork() и execvp()
#define MAXARGS 2
struct pcb {
pid_t pid; // system process ID
char *args[MAXARGS]; // program name and args
int arrivaltime;
int remainingcputime;
struct pcb * next; // links for Pcb handlers
int priority, memalloc, res1, res2, res3, res4, status;
};
typedef struct pcb Pcb;
typedef Pcb * PcbPtr;
первый из которых является название программы, которая будет выполнена.
И это моя вилка функция
PcbPtr startPcb(PcbPtr process) {
int pid;
switch (pid=fork()) {
case -1:
return NULL;
case 0:
execvp(process->args[0], process->args);
default:
return process;
}
process->status = 2;
return process;
}
Примечание: process->args[0]
только константная строка называется «процесс», который относится к скомпилированной программе под названием «процесс» в текущем каталоге.
Нет аргументов.
Когда я использую GDB и следить за процессом ребенка его просто говорит:
[New process 15186]
[Switching to process 15186]
13 execvp(process->args[0], process->args);
(gdb)
Program received signal SIGTSTP, Stopped (user).
startPcb (process=0x602250) at util.c:13
13 execvp(process->args[0], process->args);
(gdb)
Почему получение SIGSTP?
ли это произойти, если вы _not_ трассировку в GDB? – bdonlan
yes: "[24] + Stopped ./hostd feed" – Milk
Попробуйте запустить 'strace -ff -o trace./Yourprogram' и скопируйте файлы' trace.NNNNN', которые он создаст. Это отобразит все системные вызовы, которые выполняет ваша программа, - на более низком уровне, чем gdb покажет вам. – bdonlan