繁体   English   中英

fork()和exec()在C中并行运行

[英]fork() and exec() run in parallel in C

我正在尝试并行运行三个execv(“ ./ test”,execv_str)。 当每个execv()成功完成时,我需要打印出成功消息。

但是现在我得到的结果如下:

username@username:~/Desktop/$./test -p
SUCCESS
SUCCESS
SUCCESS
username@username:~/Desktop/$ TESTING
TESTING
TESTING

预期结果将是:

username@username:~/Desktop/$./test -p
TESTING
SUCCESS
TESTING
SUCCESS
TESTING
SUCCESS
username@username:~/Desktop/$

这是代码。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

int fork_execv()
{
    int status;
    pid_t pid;

    pid = fork();

    /* Handling Child Process */
    if(pid == 0){
        char* execv_str[] = {"./test", NULL};
        if (execv("./test",execv_str) < 0){
            status = -1;
            perror("ERROR\n");
        }
    }

    /* Handling Child Process Failure */
    else if(pid < 0){
        status = -1;
        perror("ERROR\n");
    }

    return status;
}

int main(int argc, char *argv[]){
    if (argc == 1){
        sleep(5);
        printf("TESTING\n");
    }
    else{
        int i;
        for(i = 0; i < 3; ++i){
            if (fork_execv() != -1){ 
                printf("SUCCESS\n");
            }
        }
    }
}

如何修改我的代码以使其工作?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

int fork_execv()
{
    int status;
    pid_t pid;

    pid = fork();

    /* Handeling Chile Process */
    if(pid == 0){
        char* execv_str[] = {"./test", NULL};
        if (execv("./test",execv_str) < 0){
            status = -1;
            perror("ERROR\n");
        }
    }

    /* Handeling Chile Process Failure */
    else if(pid < 0){
        status = -1;
        perror("ERROR\n");
    }

    return pid;
}
void handler(int sig){
    printf("SUCCESS\n");
}
int main(int argc, char *argv[]){

    if (argc == 1){
        sleep(5);
        printf("TESTING\n");
    }
    else{

        int i;
        pid_t process_id;
        for(i = 0; i < 3; ++i){
            if ((process_id = fork_execv()) != -1){
              if(process_id != 0){
                signal(SIGCHLD, handler);
                waitpid(process_id, NULL, 0);
              }

            }
        }
    }
}

在这里我会做。 派生后,我返回pid,检查它是否不为0(这样我们就处于父进程中),然后让父亲等待儿子。 为了打印“成功”,我绑定了子进程结束时触发的SIGCHLD信号。 请注意,这有点用力过大,并且在waitpid完成这项工作之后再打印。 (但我喜欢绑定信号。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM