gpt4 book ai didi

c - 使用 fork() 进行拆分过程-程序有什么问题

转载 作者:太空宇宙 更新时间:2023-11-04 09:48:40 25 4
gpt4 key购买 nike

我非常希望您能帮助我理解为什么在使用 fork() 命令后进程没有到达“子进程”。我正在尝试编写一个运行另一个程序的程序,但似乎该程序甚至没有到达子进程。我可以看出,因为“子进程”没有被打印到屏幕上,我真的很想知道为什么。

这是代码的草图 - 我什至无法检查它是否正确,因为正如我所说,它甚至没有到达子进程,我总是得到“子错误退出”。

#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <assert.h>
#include <signal.h>
#include <string.h>
#include <stdio.h>
#include <dirent.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/time.h>
#include <time.h>



#define MAXARGV 5;

int main() {
char* cmd;

int child_status;

char* s;
char** argv;
int counter;

cmd= (char*) calloc( 5, sizeof(char)*20);
s=(char*) calloc(1,sizeof(char)*20);
argv=(char**) calloc(5, sizeof(char*)*20);




printf("Please write a command\n");

gets(cmd);

counter = 0;

while (strcmp(cmd, "exit") != 0) {

int pid = fork();


if (pid == 0) {
printf("son process");

while (sscanf(cmd, "%s", s) == 1) {

strcpy(argv[counter], s);
counter++;
}

execv(argv[0], argv);

printf("the command is not legal");
assert(0);

}

else {

if (wait(&child_status) == -1) {
printf("error waiting for pid=%d\n", pid);
exit(-1);
}

if(WIFEXITED(child_status)!=0)
printf("son status=%d\n", WEXITSTATUS(child_status));
else
printf("son exited with error\n");

}

printf("Please write a command");

gets(cmd);

}

free(s);
free(cmd);
free(argv);
printf("here as well");
return 1;
}

最佳答案

  1. 程序到达 printf("son process") 就好了,但这只是将字符串放在进程内的缓冲区中,因为你没有 fflush() 它,它不会出现在屏幕上,并在 exec 调用中与进程内存的其余部分一起被丢弃。请注意,stdout 通常是行缓冲的,因此如果您在那里有换行符,它会自动刷新。此外,stderr 默认情况下是无缓冲的,更适合调试打印 (fprintf(stderr, "child process"))。
  2. 您正在尝试将从标准输入中读取的命令组装到 argv 中,但它只有提供给您的实际参数的内存,因此您超出了该内存并出现段错误。
  3. 如果 WIFEXITED 给出零,您应该使用 WIFSIGNALEDWTERMSIG 来确认错误确实是 SIGSEGV。
  4. assert(0) 不是在出错后终止进程的好方法。 exit(1) 是。断言仅适用于指示代码本身存在错误的情况,如果它们发生并且通常会从生产代码中消除(通过定义 NDEBUG)。

关于c - 使用 fork() 进行拆分过程-程序有什么问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13583622/

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