我正在嘗試使用 fork 方法呼叫不同的程式并等待它完成,我試圖檢查是什么問題,似乎等待函式沒有等待 childReturns 并且它不列印答案。(任務是回圈比較方法直到 ctrl c )
我呼叫的程式是一個比較 2 個字串的比較器。
問題是等待函式不等待子編譯是GCC
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <unistd.h>
#include <sys/wait.h>
#define LINELEN (80)
char *mygets(char *buf, int len);
char *progName(char *prog);
int main(int argc, char *argv[])
{
char *args[3];
char str1[LINELEN 1];
char str2[LINELEN 1];
int childReturns;
if (argc != 2)
return -1;
char *prog = progName(argv[1]);
if (prog == NULL)
return -1;
args[0] = prog;
while (1)
{
printf("Enter string:");
if (mygets(str1, LINELEN) == NULL)
break;
printf("Enter string:");
if (mygets(str2, LINELEN) == NULL)
break;
args[1] = str1;
args[2] = str2;
int processId = fork();
if (processId == 0)
execvp(prog, args);
else
{
wait(&childReturns); // Wait for the child
printf("Child code is %d\n", WEXITSTATUS(childReturns));
}
}
free(prog);
return 0;
}
char *progName(char *prog)
{
char *filePath = (char *)malloc(strlen(prog) 3);
if (!filePath)
return NULL;
strcpy(filePath, "./");
strcat(filePath, prog);
return filePath;
}
char *mygets(char *buf, int len)
{
char *retval;
retval = fgets(buf, len, stdin);
buf[len] = '\0';
if (buf[strlen(buf) - 1] == 10) /* trim \r */
buf[strlen(buf) - 1] = '\0';
else if (retval)
while (getchar() != '\n')
; /* get to eol */
return retval;
} ```
uj5u.com熱心網友回復:
fork()系統呼叫復制了母行程。生成的子行程和父行程將擁有自己的地址空間。所以子行程不能修改childReturns父行程的變數。
此外,wait(NULL)等待子行程結束。
uj5u.com熱心網友回復:
正如 Jonathan Leffler 所說,問題出在 args 上,execvp()需要陣列 off args 到底有NULL。
這解決了問題。
正確的代碼:
char str1[LINELEN 1];
char str2[LINELEN 1];
int childReturns = 1;
if (argc != 2)
return -1;
char *prog = progName(argv[1]);
if (prog == NULL)
return -1;
char *args[4];
args[3] = NULL;
args[0] = prog;
while (1)
{
printf("Enter string:");
if (mygets(str1, LINELEN) == NULL)
break;
printf("Enter string:");
if (mygets(str2, LINELEN) == NULL)
break;
args[1] = str1;
args[2] = str2;
int processId = fork();
if (processId == 0)
{
execvp(prog, args);
}
else
{
wait(&childReturns); // Wait for the child
printf("Child code is %d\n", WEXITSTATUS(childReturns));
}
}
free(prog);
return 0;```
uj5u.com熱心網友回復:
嘗試鏈接這些行:
if (processId == 0)
execvp(prog, args);
else
對這些:
if (processId == 0) {
execvp(prog, args);
perror(prog);
abort();
} else
另外,請注意 WEXITSTATUS 僅在 WIFEXITTED() 為真時有效。在這種情況下,當您的孩子處理 abort() 時,它不會是真的。所以
wait(&childReturns); // Wait for the child
printf("Child code is %d\n",
需要更多的作業,例如:
if (WIFEXITTED(childReturns)) {
printf("Child code is %d\n", WEXITSTATUS(childReturns));
} else if (WIFSIGNALED(childReturns)) {
printf("Child killed by signal %d\n", WTERMSIG(childReturns);
} else {
printf("Child suffered %#x\n", childReturns);
}
但是,你真正的問題是為什么 execvp() 失敗了?仔細看看你的args陣列有多大。它與檔案相符嗎?
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/456464.html
