2012-06-07 3 views
0

У меня возникли проблемы с попыткой выполнить процесс с использованием 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?

+0

ли это произойти, если вы _not_ трассировку в GDB? – bdonlan

+0

yes: "[24] + Stopped ./hostd feed" – Milk

+0

Попробуйте запустить 'strace -ff -o trace./Yourprogram' и скопируйте файлы' trace.NNNNN', которые он создаст. Это отобразит все системные вызовы, которые выполняет ваша программа, - на более низком уровне, чем gdb покажет вам. – bdonlan

ответ

1

Оказывается, я не указав полный путь в аргументах [0]

+0

Не было бы смысла использовать 'execvp()', если значение 'args [0]' содержит путь (что-либо с косой чертой '/' в нем). Тогда PATH не может быть использован для его поиска. –

Смежные вопросы