我正在尝试运行一个C ++程序,我从我学校的Unix命令行服务器上写过。该程序应该使用诸如pipe()和fork()之类的命令来计算子进程中的整数,并通过管道将其发送到父进程。我遇到的问题是当我在编译程序后尝试运行程序时,除了' 0'之外没有任何事情发生。在提示之前插入。我不完全理解分叉和管道,所以我会发布整个程序,以防问题在于我使用这些命令。可能有错误,因为我还没能成功运行它。这是我的代码:
$('.multi-dropdown-list-1 a').click(function() {
var value = $(this).data('category');
var value2 = $(this).data('tag');
var input = $('#sub_category');
var input2 = $('#tags');
input.val(value);
input2.val(value2);
if (value != null){
$("#industry_form").submit();
}
});
当我尝试编译并运行程序时,这是我在命令窗口(包括提示符)中看到的内容:
#include <cstdlib>
#include <iostream>
#include <string>
#include <array>
#include <cmath>
#include <unistd.h>
using namespace std;
// Return bool for whether an int is prime or not
bool primeChecker(int num)
{
bool prime = true;
for (int i = 2; i <= num / 2; ++i)
{
if (num%i == 0)
{
prime = false;
break;
}
}
return prime;
}
int main(int argc, char *argv[])
{
int *array;
array = new int[argc - 1]; // dynamically allocated array (size is number of parameters)
int fd[2];
int count = 0; // counts number of primes already found
int num = 1; // sent to primeChecker
int k = 1; // index for argv
int addRes = 0;
// Creates a pair of file descriptors (int that represents a file), pointing to a pipe inode,
// and places them in the array pointed to. fd[0] is for reading, fd[1] is for writing
pipe(fd);
while (k < argc)
{
if (primeChecker(num)) // if the current number is prime,
{
count++; // increment the prime number count
if (count == (stoi(argv[k]))) // if the count reaches one of the arguments...
{
array[k - 1] = num; // store prime number
k++; // increment the array of arguments
}
}
num++;
}
pid_t pid;
pid = fork();
if (pid < 0) // Error occurred
{
cout << "Fork failed.";
return 0;
}
else if(pid == 0) // Child process
{
for (int i = 0; i < (argc-1); i++)
{
// Close read descriptor (not used)
close(fd[0]);
// Write data
write(fd[1], &addRes, sizeof(addRes)); /* write(fd, writebuffer, max write lvl) */
// Close write descriptor
close(fd[1]);
}
}
else // Parent process
{
// Wait for child to finish
wait(0);
// Close write descriptor (not used)
close(fd[1]);
// Read data
read(fd[0], &addRes, sizeof(addRes));
cout << addRes;
// Close read descriptor
close(fd[0]);
}
return 0;
}
没有任何反应。我尝试过不同的命名变体,并从“a.out”中运行它。没有成功。
tl; dr编译并尝试执行我的程序后,Unix命令提示符只是在提示的开头添加0而不执行任何操作。
任何人都可以给予我的任何帮助都将非常感激,因为我无法找到关于“0”的任何信息。出现在提示之前。
答案 0 :(得分:1)
你的程序完全按照你的要求去做!您将addRes
送入管道,然后将其打印出来。 addRes
初始化为0并且从未更改过。在您的孩子中,您想要通过num
。此外,您可能还想打印一个新行(&#39; \ n&#39;)。
答案 1 :(得分:0)
你永远写任何东西到管道;每个命令行参数写一次,./prog2.exe
不提供任何参数,所以循环永远不会执行
如果你传递了一个参数,你会写addRes
;你永远不会改变addRes
,所以你在父母中得到0
如果你传递了多个参数,你会写一个addRes
然后关闭频道。这不是太糟糕,因为你从来没有读过多个addRes
。
您打印出的addRes
(与其初始化int addRes = 0
相同)没有换行符,这会使下一个提示符紧挨着它(使用cout << addRes << endl
将打印出换行符,使其更漂亮)