2012-06-07 56 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; 

其中第一個是該程序的要執行的名稱。

這是我的fork函數

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

如果您在gdb中不進行跟蹤,會發生這種情況嗎? – bdonlan

+0

yes:「[24] +已停止./hostd feed」 – Milk

+0

嘗試運行'strace -ff -o trace。/ yourprogram',並粘貼它將創建的'trace.NNNNN'文件。這將列出您的程序正在執行的所有系統調用 - 在比gdb更低的級別會顯示您。 – bdonlan

回答

1

原來我沒有在args中指定完整路徑[0]

+0

如果'args [0]'值包含一個路徑(任何帶有斜槓'/'的內容),那麼使用'execvp()'就沒有多大意義。然後PATH不能用來找到它。 –