我正在编写一个需要创建多个进程的程序。假设这个数字是3.我希望这些进程中的每一个都从1到5计数和输出,并在每个计数/输出之间休眠1秒。我尝试以下面的方式做到这一点,但我的睡眠(1)没有像被打断那样工作。我会很感激这个主题的背景,我做错了什么,以及如何解决这个问题。到目前为止,这是我的代码。
/*
* Creates N > 2 processes.
*/
int main(int argc, const char * argv[])
{
pid_t pid;
for(int i = 0; i < N_PROC; i++) {
pid = fork();
if(pid == 0) {
ProcessWork();
exit(0);
}
}
}
/*
* Work of a single process.
*/
void ProcessWork() {
char buffer[BUF_SIZE];
for (int i = 1; i <= 5; i++) {
sleep(1);
sprintf(buffer, "PID = %d, count = %d\n", getpid(), i);
write(1, buffer, strlen(buffer));
}
}
答案 0 :(得分:0)
你的sleep()完全正常工作。但是,您的问题似乎是父进程不等待子进程的终止,因此父进程在子进程执行之前终止。因此,它在Unix系统上看起来像这样:
% ./a.out
% PID = 41431, count = 1
PID = 41430, count = 1
PID = 41432, count = 1
PID = 41431, count = 2
PID = 41430, count = 2
PID = 41432, count = 2
PID = 41430, count = 3
PID = 41431, count = 3
PID = 41432, count = 3
PID = 41430, count = 4
PID = 41431, count = 4
PID = 41432, count = 4
PID = 41431, count = 5
PID = 41430, count = 5
PID = 41432, count = 5
您应该查看wait()系统调用的手册页。你可以在一个循环中调用该系统调用,只要有子节点就会返回被终止子节点的pid,并且一旦你的子节点已经用完,它就会返回-1和errno == ECHILD。 ECHILD可以用作循环终止标准。
答案 1 :(得分:0)
等待分叉进程终止,如果我理解你的问题......
int main(int argc, const char * argv[])
{
pid_t pid[N_PROC];
for(int i = 0; i < N_PROC; i++) {
pid_t cur_pid = fork();
if(cur_pid == 0) {
pid[i] = cur_pid;
ProcessWork();
exit(0);
}
}
for(int i = 0; i < N_PROC; i++)
wait(&pid[i]);
}