【问题标题】:c++ issue with using commandline inputs in a forked execvp在分叉的 execvp 中使用命令行输入的 C++ 问题
【发布时间】:2021-01-03 21:17:32
【问题描述】:

运行下面的代码时,我得到一个不正确的输出。我很确定我在执行 execvp 调用时做错了,因为我尝试更改所有内容,但似乎只有这才是负责任的。据我所知,execvp 的参数应该是我使用 execvp(argv[0], argv) 传递的文件名和数组。用 argv[1] 之类的东西替换这些参数似乎会改变输出,这就是为什么我认为我在这里做错了。

a.out file -> lab1 (g++ lab1.cpp -o lab1)
folder -> lab1
.cpp file -> lab1.cpp

当前输出:

steve@fish lab1]$ lab1 ls -l
lab1 ls -l Parent process id is: 1747646
lab1 ls -l Child process id is: 1747647
[vnath@storm lab1]$ lab1: cannot access 'ls': No such file or directory

应该是什么输出:

steve@fish lab1]$ lab1 ls -l
lab1 ls -l Child process pid is 7302
total 30
-r-xr-xr-x 1 steve staff  3567 Aug 17 07:45 lab1
-rwxr--r-- 1 steve staff   547 Aug 17 08:00 lab1.cpp
-rw-r--r-- 1 steve staff 11291 Aug 17 08:15 lab1.html
-rw-r--r-- 1 steve staff   621 Aug 17 09:59 linux.txt
lab1 ls -l Parent process pid is 7301

代码:

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

using namespace std;

int main(int argc, char* argv[])
{
  int ppid = 0;
  int cpid = 0;
 

  pid_t pid = fork();

  if(pid == -1) // error handling
  {
    perror("fork");
    return 1; // added
  }
  if(pid == 0) // child process
  {
    //cpid = pid;
    cpid = getpid();

    for(int i = 0; i < argc; i++)
       cout << argv[i] << " ";

    cout << "Child process id is: " << cpid << endl;

  
    if(execvp(argv[1], argv) < 0)
    {
      perror("exec");
      return 1;
    }
  }

  if(pid > 0) // parent process
  {
    ppid = getpid();

    for(int i = 0; i < argc; i++)
       cout << argv[i] << " ";

    cout << "Parent process id is: " << ppid << endl;
  }

  return 0;
}                

【问题讨论】:

  • 你看不出-ls -lls -l之间的区别?在您的路径中没有名为-ls 的命令。
  • 是的,您遇到了一个错字,抱歉,已更新问题

标签: c++ linux fork execvp


【解决方案1】:

对于任何好奇的人来说,execvp(argv[1], &amp;argv[1]) 是让这一切正常工作的关键。

【讨论】:

  • 如果您解释一下为什么这是必要的,答案会更好。
  • 如果不想在提示后输出,父进程应该使用wait()等待子进程完成。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-06
  • 1970-01-01
  • 1970-01-01
  • 2014-03-20
  • 2015-02-13
  • 2021-03-16
  • 2020-08-11
相关资源
最近更新 更多