【发布时间】:2012-06-07 04:59:44
【问题描述】:
我在尝试使用 fork() 和 execvp() 执行进程时遇到问题。我有一个结构Pcb,它有一个参数数组(args):
#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] 只是一个名为“process”的常量字符串,它指的是当前目录中名为“process”的编译程序。
没有参数。
当我使用 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?
【问题讨论】:
-
如果您不在 gdb 中进行跟踪,是否会发生这种情况?
-
是:“[24]+ 已停止 ./hostd 提要”
-
尝试运行
strace -ff -o trace ./yourprogram,然后将它创建的trace.NNNNN文件粘贴到其中。这将列出您的程序正在执行的所有系统调用 - 比 gdb 向您显示的级别更低。 -
非常感谢您的帮助。我已将它们粘贴到一页中:pastebin.com/NzYUVUvQ
-
你应该在
execvp()后面加上一些错误处理代码,以防shell无法执行程序。