C++ dup2 and execl
C++ dup2 and execl
我正在处理一个赋值,我需要创建管道,以便其他程序处理不同的函数。我可以通过管道通过命令行没有问题,这很容易。然而,使用dup2和execl对我来说一直很棘手。有一次,我能够从程序的一部分获得输出,但它没有从另一部分读取任何内容。
这是我的
pipeline.cpp
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <stdlib.h>
#include <cstdlib>
#include <iostream>
#include <cctype>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include<iostream>
#include<cstdlib>
#include<unistd.h>
#include<iomanip>
#include <sys/wait.h>
using namespace std;
int main(int argc, char *argv[])
{
int number = atoi(argv[1]);
int x2ypipe[2];
pipe(x2ypipe);
if(x2ypipe==0){
cout<<"ERROR:"<<errno<<endl;
}
pid_t xchild =fork();
if(xchild==0){
dup2(x2ypipe[1],STDOUT_FILENO);
close(x2ypipe[0]);
close(x2ypipe[1]);
execl("./part1.cpp","part1.cpp", (char *)NULL);
}
pid_t ychild =fork();
if(ychild==0){
dup2(x2ypipe[0],STDIN_FILENO);
close(x2ypipe[0]);
close(x2ypipe[1]);
execl("./part2.cpp", "part2.cpp", (char *)NULL);
}
close(x2ypipe[0]);
close(x2ypipe[1]);
wait(NULL);
wait(NULL);
part1.cpp
#include<iostream>
#include<cstdlib>
#include<unistd.h>
#include<iomanip>
using namespace std;
int main(int argc, char *argv[])
{
int number = atoi(argv[1]);
for (int k = 1; k <= 9; k++)
{
cout << k << " " << flush;
sleep(1);
}
return 0;
}
part2.cpp
#include <iostream>
#include <cstdlib>
#include <unistd.h>
#include <iomanip>
using namespace std;
int main()
{
int number;
while (cin >> number)
{
cout << 2 * number - 1 << " " << flush;
}
return 0;
}
好的,pipeline.cpp:分叉两次,并在两个子级之间创建一个管道。然后,每个人都使用excel将其流程替换为程序第1部分和第2部分。因此,我的理解是,第1部分程序将运行,它输出的任何内容都将由运行第2部分的第二个子程序获取,从那里开始,第2部分将正常输出,因为它的输出描述符没有更改。我是不是遗漏了什么或滥用了什么?
我注意到了一些事情:
- 执行
number
时,没有将其传递给part1
进程 - 您没有检查
execl()
或任何其他操作系统功能的故障
我认为,一旦你做了这两件事,你就会发现真正的问题是什么。我不会只告诉你答案是什么,因为如何自己诊断这些问题是值得学习的。(我只做了一些小修改就成功地运行了你的代码。问题不在于你如何处理管道和文件描述符。(
我认为您需要在exec
调用后使用return 0;
。但我似乎比你更失落。
相关文章:
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- 为什么C++逐位AND运算符在不同大小的操作数中表现为这样
- 为什么 Clang 不允许"and"作为函数名称?
- 位阵列上的快速AND运算
- 是否可以在 C++03 中定义'move-and-swap idiom'等效项
- BoostPython and CMake
- OpenSSL BIO and SSL_read
- Gurobi GRBModel and GRBmodel in C++
- std::visit and std::variant usage
- SHBrowseForFolder with BIF_BROWSEFORCOMPUTER and SHGetPathFr
- Directx12 and keystrokes
- different between int **arr =new int [ n]; and int a[i][j]?
- C++ getenv and setenv
- Inference pytorch C++ with alexnet and cv::imread image
- Visual Studio 2019 C++ and std::filesystem
- 保证逻辑 AND 表达式中的函数调用
- python ctypes and C++ pointers
- C++ const char with .begin() and .end()
- Threads with Classes and std::packaged_task
- C++ dup2 and execl