【问题标题】:fork() and execvp()fork() 和 execvp()
【发布时间】: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无法执行程序。

标签: c fork execvp


【解决方案1】:

原来我没有在 args[0] 中指定完整路径

【讨论】:

  • 如果args[0] 值包含路径(任何带有斜线/ 的内容),则使用execvp() 没有多大意义。那么PATH就无法找到了。
猜你喜欢
  • 2012-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-23
相关资源
最近更新 更多