【发布时间】:2019-03-30 13:34:48
【问题描述】:
在我的 c++ 分配中控制三个子进程的输出顺序时遇到问题。
所以赋值的要求是创建三个子进程。 A,B和C。我可以完成它。然后我不得不在三个子进程中做一些操作。
A:12 步计数器,每次打印“A”并休眠 1 秒 B:在两个打印的“A”之后打印“B” C:运行 B 3 次后打印“C”
我必须保持进程运行才能完成任务...
sig_atomic_t sigusr1_count = 0;
bool bNeedDoWork = false;
bool cNeedDoWork = false;
void handlerForStep (int signal_number) //signal handler
{
++sigusr1_count;
}
void handlerForB (int signal_number) //signal handler
{
bNeedDoWork = true;
}
void handlerForC (int signal_number) //signal handler
{
cNeedDoWork = true;
}
int main() {
using namespace std;
pid_t childA_pid, childB_pid, childC_pid;
/* Set up A handler operation*/
struct sigaction sa;
memset (&sa, 0, sizeof (sa));
sa.sa_handler = &handlerForStep;
sigaction (SIGUSR1, &sa, NULL);
childA_pid = fork();
if (childA_pid == 0) {
for (int i = 0; i < 12; i++) {
system("echo A");
kill(getppid(), SIGUSR1);
sleep(1);
}
exit(0);
} else {
childB_pid = fork();
if (childB_pid == 0) {
/*Set up B handler operation*/
/*...*/
//sleep until handler B receive signal
while (true) {
sleep(1);
if (bNeedDoWork) {
bNeedDoWork = false;
system("echo B");
}
}
exit(0);
} else {
childC_pid = fork();
if (childC_pid == 0) {
/*Set up C handler operation*/
/*...*/
//sleep until handler C receive signal
while (true) {
sleep(1);
if (cNeedDoWork) {
cNeedDoWork = false;
system("echo C");
}
}
exit(0);
} else {
while (true) {
sleep(1);
if (sigusr1_count != 0 && sigusr1_count % 2 == 0) {
kill(childB_pid, SIGUSR1);
}
if (sigusr1_count != 0 && sigusr1_count % 6 == 0) {
kill(childC_pid, SIGUSR1);
}
}
}
}
}
return 0;
}
有点长。但我担心这是生成流程的真正正确方法。
我希望结果是“A A B A A B A A B C A A B A A B A A B C” 但结果是“A A B A A C B ........”
C 在 B 打印之前打印。甚至一些字母 A、B、C 在这个序列之后都被弄乱了。
这是区分B进程和C进程的计数方法吗:
if (sigusr1_count != 0 && sigusr1_count % 2 == 0) {
kill(childB_pid, SIGUSR1);
}
if (sigusr1_count != 0 && sigusr1_count % 6 == 0) {
kill(childC_pid, SIGUSR1);
}
正确吗?
是否可以使用wait(&status) 来防止在输出 B 之前操作输出 C ?
谢谢。
【问题讨论】:
-
您的
B和C进程需要休眠超过一秒,不是吗?事实上,他们不应该无限期地pause()吗? -
我假设信号是分配所必需的,但管道会更简单,更容易在这里变得健壮。
-
但是如果 B 和 C 的睡眠时间更长,A 的输出可能会在 B 和 C 的输出之前每 1 秒打印 3 次或 4 次作为 A 输出
-
任何捕捉到的信号interrupts
sleep! -
对不起,我仍然无法理解信号和睡眠之间的关系。你能进一步解释甚至展示一些例子吗?如果可以的话非常感谢!我对这个话题很陌生。
标签: c++ linux process child-process