【问题标题】:C System Programming with fork()使用 fork() 进行 C 系统编程
【发布时间】:2017-01-22 21:25:06
【问题描述】:

好吧,我到底做错了什么?我在 Ubuntu 上执行此操作,我希望它采用系统命令“ls”和诸如“-a”之类的参数,然后让子执行它,然后父打印出来。我不明白为什么我总是让“父母”返回两次。有什么想法吗?

#include  <stdio.h>
#include  <sys/types.h>
#include <time.h>
#include <stdlib.h>
#include <sys/time.h>
#include <unistd.h>
#include <sys/wait.h>

void Cprocess(char *commands, char *scommands[]);
void Pprocess(void);

void main(int argc, char *argv[])
{

    char *sendcommand[] = {argv[1],argv[2],0};
    char *commands = argv[0];
    int pid;

    if((pid=fork()) ==-1)
    {
            perror("Error!!\n");
    }
    else if(pid==0)
            Cprocess(commands, sendcommand);
    else
    {
            wait(0);
            printf("Parent\n");
    }
}
void Cprocess(char *argv1, char *argv2[])
{
    execvp(argv1, argv2);
    exit(19);
}

这对我来说不是很好,这是我输入的命令:

./filename ls -a

这是我的结果:

filename1   filename2   filename3
Parent
Parent

【问题讨论】:

  • 您告诉您的孩子运行command,即argv[0],这是当前程序。大概,你的意思是复制argv[1]而不是argv[0]?或者您可以不使用单独的command,而只需使用sendcommand[0] 作为execvp() 的第一个参数。不过,我还没有追踪到为什么你没有得到很多孩子再次运行父母的副本。
  • 顺便说一句:main() 应该返回 int。

标签: c linux operating-system


【解决方案1】:

恭喜:您的程序运行良好。我认为您通过插入 Cprocess() 函数使事情变得比需要的复杂一些;没有它,发生的事情可能会更清楚一些。请允许我重新安排一下您的程序:

void main(int argc, char *argv[]) {
    int pid = fork();

    if (pid ==-1) {
        perror("Error!!\n");
    } else if (pid==0) {
        char *sendcommand[] = { argv[1], argv[2], 0 };
        execvp(argv[0], sendcommand);
        exit(19);
    } else {
        wait(0);
        printf("Parent\n");
    }
}

这在功能上等同于您原来的 main(),我敢打赌您会立即发现其中的问题。

提示:

仔细查看execvp() 的参数。

提示 2:

execvp() 的第一个参数指定要运行的程序。

提示 3:

你是认真的吗?让你的大脑工作,或者至少让你的调试器工作。

【讨论】:

  • 准确添加您的代码并更改:execvp(argv[0], sendcommand);到 execvp(argv[1], sendcommand);它奏效了。为什么我收到两个回复?附:喜欢提示!
  • 您的程序在其参数中收到的argv[0] 通常是程序本身的名称。如果您将它作为第一个参数传递给execvp(),那么您就是在告诉它运行父程序的另一个副本。另请注意,作为第二个参数传递给execvp() 的数组应该遵循相同的约定——第一个元素(在索引0 处)应该是某种形式的程序名称;实际参数从索引 1 开始。
  • 感谢您的快速回复和解释。
猜你喜欢
  • 2011-07-13
  • 1970-01-01
  • 1970-01-01
  • 2016-01-13
  • 2012-04-27
  • 1970-01-01
  • 1970-01-01
  • 2018-02-09
  • 2012-02-02
相关资源
最近更新 更多