在C中创建多个进程

时间:2015-03-21 11:34:00

标签: c process multiprocessing sleep

我正在编写一个需要创建多个进程的程序。假设这个数字是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));
    }
}

2 个答案:

答案 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]);
}