如何在C中使用n命令运行程序



我现在已经一个接一个地编译了它。我还面临着终止流程的问题。

int main(int argc, char *argv[]) {
int n = 1;
int f = 1;
signal(SIG_ERR, sig_hand1);
signal(SIGINT, sig_hand1);
for (f; f < argc; f++){ \create n-numberd fork.
nfork(f, argv);
}
for (n; n<argc; n++){ \terminate the child one by one.
Rturn(n, argv);
}
return 0;

}

具有回转功能

void Rturn(int n, char *argv[]){
int status;
struct rusage usage;
struct timeval start;
struct timeval end;
wait4(-1, &status, 0, &usage);
if(WIFSIGNALED(status)==1){
char *str = strdup(signame[WTERMSIG(status)]);
printf("nThe command %c%s%c is interrupted by the %snn", '"', argv[n], '"',str);
}
else if(WEXITSTATUS(status) == 255)
printf("The program experienced an error in starting the command: %snn", argv[n]);
else
printf("nThe command %c%s%c terminated with returned status code = %dnn", '"', argv[n], '"', WEXITSTATUS(status));
}

并标记

void nfork(int n, char *argv[]){
if(fork() == 0){
printf("Process with id:%d created for the command: %sn", getpid(), argv[n]);
fflush(stdout);
if(execlp(argv[n], argv[n], NULL) == -1){
printf("nexeclp:  %snn", strerror(errno));
exit(-1);
}
}

}

我发现消息不是由进程返回的,而是由循环中的n返回的。

例如,如果我运行

./test cd fake //with command cd and "fake"

然后它将返回

monitor experienced an error in starting the command: cd

预期回报应该像这个

monitor experienced an error in starting the command: fake

如何找到变量n的正确子项?

成功时,fork()函数返回两次。在父进程中,其返回值是新子进程的进程ID。在子进程中,返回值为0。通过返回给它的进程ID,家长可以识别特定的孩子,以便等待他们,向他们发送信号,等等。。

您的nfork()函数目前忽略fork()的返回值,只是检查它是否为零。这是错误的,有两个原因:

  1. 父级不区分fork()调用的成功与失败。它只是假设它成功了。

  2. 父级希望以后能够将特定的子级与n的相应值相关联。各个流程通过其流程ID进行标识。只有在nfork()中才有机会将子进程ID与n值相关联,但函数未能利用这一机会。

可以通过多种方式记录子索引和子进程ID之间的关联,但最简单的方法可能是创建一个数组来存储它们。nfork()需要填充数组,RTurn()需要从中提取要等待的PID,然后将其作为第一个参数提供给wait4()

相关内容

  • 没有找到相关文章

最新更新