2012-06-07 1 views
0

fork()execvp()을 사용하여 프로세스를 실행하는 데 문제가 있습니다. 실행하는 프로그램의 이름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; 

제 어느 : I는 인수의 배열 (args)이 구조체 Pcb있다.

그리고 이것은 내 포크 기능

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] 그냥 현재 디렉토리에 '공정'라는 컴파일 된 프로그램을 말한다 "프로세스"라는 CONST 문자열입니다.
인수가 없습니다.

내가 GDB를 사용하고 자식 프로세스에 따라 그 단지 말한다 : 왜 SIGSTP을 받고

[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) 

?

+0

이 발생 하는가에 전체 경로를 지정하지 않은 밝혀? – bdonlan

+0

yes : "[24] + ./hostd feed가 중지되었습니다." – Milk

+0

'strace -ff -o trace./yourprogram'을 실행하고 생성 할'trace.NNNNN' 파일을 붙여 넣으십시오. gdb가 보여줄 것보다 낮은 레벨에서 프로그램이 수행하고있는 모든 시스템 호출을 나열합니다. – bdonlan

답변

1

내가 인수 당신이 _not_ GDB에서 추적하는 경우 [0]

+0

'args [0]'값에 경로 (슬래시'/'가있는 항목)가있는 경우'execvp()'사용에 별다른 의미가 없습니다. 그런 다음 PATH를 사용하여 찾을 수 없습니다. –