在分叉的 execvp 中使用命令行输入的 C++ 问题
c++ issue with using commandline inputs in a forked execvp
当 运行 下面的代码时,我得到了不正确的输出。我相当确定我在 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;
}
任何好奇的人都会发现 execvp(argv[1], &argv[1])
是一切正常的关键。
当 运行 下面的代码时,我得到了不正确的输出。我相当确定我在 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;
}
任何好奇的人都会发现 execvp(argv[1], &argv[1])
是一切正常的关键。