sách gpt4 ai đã đi

c - 如何获取子进程的退出状态?

In lại 作者:行者123 更新时间:2023-11-30 16:11:16 26 4
mua khóa gpt4 Nike

两个示例输出(由我的教授提供)是(这些在 Linux 终端中输入):

 ibrahim@ibrahim-latech:~$ ./prog2 .
Current working directory: /home/ibrahim
Executing ls . --all -l --human-readable
total 24M
drwxr-xr-x 74 ibrahim ibrahim 20K Oct 26 16:08 .
drwxr-xr-x 6 root root 4.0K Apr 10 2014 ..
-rw-r--r-- 1 ibrahim ibrahim 4.1K Sep 13 12:09 .bashrc
drwxr-xr-x 7 ibrahim ibrahim 4.0K Oct 11 14:51 Desktop/
...snip...
Exit status: 0

因此,如果代码有效,退出状态为 0,但此示例:

 ibrahim@ibrahim-latech:~$ ./prog2 /root
Current working directory: /home/ibrahim
Executing ls /root --all -l --human-readable
Can't chdir to /root
Exit status: 1

退出状态为 1,因为它是 false。

Đây là mã của tôi:

#include 
#include
#include

int main(int argc, char *argv[]){
pid_t pid;
pid = fork();
char cwd[255];
if(pid == 0){
printf("Current working directory: %s\n",getcwd(cwd, sizeof(cwd)));
printf("Executing ls %s --all -l --human-readable\n",argv[1]);
if(chdir(argv[1])!=0){
printf("this is not a valid directory");
}
else{
execl("/bin/ls","ls","--all","-l","--human-readable", NULL);
}
}
else{
wait(NULL):
printf("Exit status:");// not sure how to put the 1 or 0 in this
}
}

退出状态必须由父进程输出。我不知道如何让退出状态发挥作用。

1 Câu trả lời

将评论中的关键信息转化为答案。

wait()函数告诉您 PID 和退出状态 - 您只需捕获它们,而不是忽略它们。您需要使用 WIFEXITEDWEXITSTATUS (如果 WIFEXITED 报告 false,还有其他宏可用于信号和核心转储等)。

修改您的代码:

#include 
#include
#include
#include
#include

#ifndef LS_PATH
#define LS_PATH "/bin/ls"
#kết thúc nếu

int main(int argc, char **argv)
{
if (argc != 2)
{
fprintf(stderr, "Usage: %s directory\n", argv[0]);
return 1;
}
pid_t pid = fork();
if (pid == 0)
{
char cwd[255];
printf("Current working directory: %s\n", getcwd(cwd, sizeof(cwd)));
printf("Executing 'ls -a -l' in %s\n", argv[1]);
if (chdir(argv[1]) != 0)
{
fprintf(stderr, "%s: %s is not a valid directory\n", argv[0], argv[1]);
return 1;
}
//execl(LS_PATH, "ls", "--all", "-l", "--human-readable", (char*) NULL);
execl(LS_PATH, "ls", "-a", "-l", (char*) NULL);
fprintf(stderr, "Failed to execute %s\n", LS_PATH);
return 1;
}
khác
{
int status;
int corpse = wait(&status);
if (corpse < 0)
printf("Failed to wait for process %d (errno = %d)\n", (int)pid, errno);
else if (corpse != pid)
printf("Got corpse of process %d (status 0x%.4X) when expecting PID %d\n",
corpse, status, (int)pid);
else if (WIFEXITED(status))
printf("Process %d exited with normal status 0x%.4X (status %d = 0x%.2X)\n",
corpse, status, WEXITSTATUS(status), WEXITSTATUS(status));
else if (WIFSIGNALED(status))
printf("Process %d exited because of a signal 0x%.4X (signal %d = 0x%.2X)\n",
corpse, status, WTERMSIG(status), WTERMSIG(status));
khác
printf("Process %d exited with status 0x%.4X which is %s\n",
corpse, status, "neither a normal exit nor the result of a signal");
}
trả về 0;
}

我在不使用 GNU ls 的 Mac 上工作,因此我已将代码编译时配置为 ls 的位置,并且它仅使用可移植的选项(-Một-l 而不是双破折号选项)。我更改了消息传递并检测到更多错误。与您的代码一样,这假设 fork() 不会失败 - 它也应该检查那里是否有错误。

示例输出(缩写) - 来自从 es61.c 编译的程序 es61:

$ es61 /orthography
Current working directory: /Users/jonathanleffler/soq
Executing 'ls -a -l' in /orthography
es61: /orthography is not a valid directory
Process 64463 exited with normal status 0x0100 (status 1 = 0x01)
$ es61 $PWD
Current working directory: /Users/jonathanleffler/soq
Executing 'ls -a -l' in /Users/jonathanleffler/soq
total 1016
drwxr-xr-x 100 jonathanleffler staff 3200 Oct 31 15:53 .
drwxr-xr-x+ 69 jonathanleffler staff 2208 Oct 31 15:53 ..

-rwxr-xr-x 1 jonathanleffler staff 9028 Oct 31 15:53 es61
-rw-r--r-- 1 jonathanleffler staff 1806 Oct 31 15:53 es61.c
drwxr-xr-x 3 jonathanleffler staff 96 Oct 31 15:43 es61.dSYM
drwxr-xr-x 9 jonathanleffler staff 288 Nov 5 2018 etc

-rw-r--r-- 1 jonathanleffler staff 390 Nov 16 2017 makefile

Process 64557 exited with normal status 0x0000 (status 0 = 0x00)
$

关于c - 如何获取子进程的退出状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58649371/

26 4 0
行者123
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com