gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 16:46:30 25 4
gpt4 key购买 nike

我正在尝试并行运行三个 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);
}

}
}
}
}

这是我要做的。 fork之后,我返回pid,检查它是否不为0(所以我们在父亲进程中)并让父亲等待儿子。为了打印“成功”,我绑定(bind)了子进程结束时触发的 SIGCHLD 信号。请注意,这有点矫枉过正,在 waitpid 完成工作之后再进行打印。 (但我喜欢绑定(bind)信号。)

关于c - fork() 和 exec() 在 C 中并行运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43708363/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com