我做常规的事情:
如果execvp因找不到cmd而失败,如何在父进程中注意到此错误?
著名的自管技巧可以适用于这一目的。
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <sys/wait.h>
#include <sysexits.h>
#include <unistd.h>
int main(int argc, char **argv) {
int pipefds[2];
int count, err;
pid_t child;
if (pipe(pipefds)) {
perror("pipe");
return EX_OSERR;
}
if (fcntl(pipefds[1], F_SETFD, fcntl(pipefds[1], F_GETFD) | FD_CLOEXEC)) {
perror("fcntl");
return EX_OSERR;
}
switch (child = fork()) {
case -1:
perror("fork");
return EX_OSERR;
case 0:
close(pipefds[0]);
execvp(argv[1], argv + 1);
write(pipefds[1], &errno, sizeof(int));
_exit(0);
default:
close(pipefds[1]);
while ((count = read(pipefds[0], &err, sizeof(errno))) == -1)
if (errno != EAGAIN && errno != EINTR) break;
if (count) {
fprintf(stderr, "child's execvp: %s\n", strerror(err));
return EX_UNAVAILABLE;
}
close(pipefds[0]);
puts("waiting for child...");
while (waitpid(child, &err, 0) == -1)
if (errno != EINTR) {
perror("waitpid");
return EX_SOFTWARE;
}
if (WIFEXITED(err))
printf("child exited with %d\n", WEXITSTATUS(err));
else if (WIFSIGNALED(err))
printf("child killed by %d\n", WTERMSIG(err));
}
return err;
}
这是一个完整的程序。
$ ./a.out foo
孩子的execvp:没有此类文件或目录
$(sleep 1 && killall -QUIT sleep&); 外出睡眠60
等待孩子...
被3杀死的孩子
$ ./a.out true
等待孩子...
孩子以0退出
工作原理:
创建一个管道,并创建write端点CLOEXEC
:exec
成功执行an时,它将自动关闭。
在孩子中,尝试exec
。如果成功,我们将不再具有控制权,但管道已关闭。如果失败,则将失败代码写入管道并退出。
在父级中,尝试从另一个管道端点读取。如果read
返回零,则说明管道已关闭并且子级必须exec
成功。如果read
返回数据,那是我们孩子编写的失败代码。
问题内容: 操作系统:Linux,语言:纯C 我将继续学习一般的C编程,在特殊情况下将学习UNIX下的C编程。 使用调用后,我检测到该函数的奇怪行为(对我而言)。 码 输出量 为什么第二个“ Hello”字符串出现在孩子的输出中? 是的,这恰恰是父母在开始时打印的内容,并带有父母的。 但!如果我们在每个字符串的末尾放置一个字符,则会得到预期的输出: 输出 : 为什么会发生?这是正确的行为还是错误?
问题内容: 我试图弄清楚如何使用boto3进行正确的错误处理。 我正在尝试创建一个IAM用户: 成功调用create_user后,我得到一个整洁的对象,其中包含API调用的http状态代码和新创建的用户的数据。 例: 这很好。但是,如果失败(例如用户已经存在),我只会得到一个类型为botocore.exceptions.ClientError的对象,其中只有文本可以告诉我出了什么问题。 示例:Cl
问题内容: 如何处理此调用上的etimedout错误? 有没有办法等待更长的时间?还是再次请求远程文件? 究竟是什么会导致此错误?仅超时? 问题答案: 这是由于在给定时间内未收到您的请求响应(通过 请求模块选项)引起的。 基本上首先要捕获该错误,您需要在上注册一个处理程序,因此不会再抛出未处理的错误:。这里还有一些解释。 在处理程序中,您可以检查错误是否为ETIMEDOUT并应用自己的逻辑:。 如
execvp(执行文件) 相关函数 fork,execl,execle,execlp,execv,execve 表头文件 #include<unistd.h> 定义函数 int execvp(const char *file ,char * const argv []); 函数说明 execvp()会从PATH 环境变量所指的目录中查找符合参数file 的文件名,找到后便执行该文件,然后将第二个参
execvp 执行文件 相关函数 fork,execl,execle,execlp,execv,execve 表头文件 #include<unistd.h> 定义函数 int execvp(const char *file, char *const argv[]); 函数说明 execvp()会从PATH 环境变量所指的目录中查找符合参数file 的文件名,找到后便执行该文件,然后将第二个参数
本文向大家介绍分库分表之后,id 主键如何处理?相关面试题,主要包含被问及分库分表之后,id 主键如何处理?时的应答技巧和注意事项,需要的朋友参考一下 因为要是分成多个表之后,每个表都是从 1 开始累加,这样是不对的,我们需要一个全局唯一的 id 来支持。 生成全局 id 有下面这几种方式: UUID:不适合作为主键,因为太长了,并且无序不可读,查询效率低。比较适合用于生成唯一的名字的标示比如文件