Tag: waitpid

不想立即删除终止子进程,需要成为僵尸

我从SE QUE获得以下信息明确地将SIGCHLD的处置设置为SIG_IGN会导致随后终止的任何子进程立即从系统中删除而不是转换为僵尸。 据我所知,要读取子状态,需要在进程表中使用子进程。 因此有必要在进程表中使用zombie子进程来读取子状态。 所以我想编写信号处理程序,它将删除“将SIGCHLD的处置设置为SIG_IGN” 我使用下面的代码(在fork之前)以避免在终止后立即删除子进程:但我仍然无法获得子状态并且waitpid使用ECHILD返回-1。 #include #include #include #include #include #include static siginfo_t sig_info; static volatile sig_atomic_t sig_num; static void *sig_ctxt; static void catcher(int signum, siginfo_t *info, void *vp) { sig_num = signum; sig_info = *info; sig_ctxt = vp; } static void set_handler(int signum) { struct sigaction sa; sa.sa_flags = SA_SIGINFO; sa.sa_sigaction = catcher; […]

execl之前的打印在输出中不可见

#include #include #include #include #include int main(void) { pid_t Checksum_pid = fork(); if (Checksum_pid 0) { if (WIFEXITED(childStatus)) printf(“\nChild Exit Code: %d\n”, WEXITSTATUS(childStatus)); else printf(“\nChild Exit Status: 0x%.4X\n”, childStatus); } else if (returnValue == 0) printf(“\nChild process still running\n”); else { if (errno == ECHILD) printf(“\nError ECHILD!!\n”); else if (errno == EINTR) printf(“\nError EINTR!!\n”); else […]

管道和工艺管理

我正在研究用C实现的一个小shell(tsh)(它是一个赋值)。 任务的一部分属于PIPING。 我必须将命令的输出传递给另一个命令。 例如: ls -l | sort ls -l | sort 当我运行shell时,我在其上执行的每个命令都由它生成的子进程处理。 孩子完成后,返回结果。 对于管道我想首先实现一个带编码的示例来检查它是如何工作的。 我写了一个部分有效的方法。 问题是当我运行管道命令时,在子进程完成后,整个程序退出它! 显然我没有正确处理子进程信号(下面的方法代码)。 我的问题: 如何使用pipe()进行流程管理? 如果我运行命令ls -l | sort ls -l | sort是否为ls -l和另一个进程sort创建子进程? 从我到目前为止看到的管道示例中,只创建了一个进程(fork())。 当处理第二个命令(从我们的示例中sort )时,我如何获得其进程ID? 编辑:同时运行此代码我得到两次结果。 不知道为什么它会运行两次,那里没有循环。 这是我的代码: pid_t pipeIt(void){ pid_t pid; int pipefd[2]; if(pipe(pipefd)){ unix_error(“pipe”); return -1; } if((pid = fork()) <0){ unix_error("fork"); return -1; } if(pid […]

C中的测试用例,用于WIFSIGNALED,WIFSTOPPED,WIFCONTINUED

我正在使用waitpid()和signal(),我正在寻找可靠的测试用例,用于返回WIFSIGNALED(状态)= WIFSTOPPED(状态)= WIFCONTINUED(状态)= true但找不到任何… 小心告诉我如何确保返回true,以便我可以调试我的代码? 另外,关于我应该用signal()检测哪些信号以测试这些宏的一些提示会有所帮助……

waitpid,wnohang,wuntraced。 我该如何使用它们

我有点困惑。 据我了解,waitpid的pid为-1意味着我等待所有孩子完成但是如果我在WNOHANG的waitpid中添加一个选项,那么如果没有完成,那些选项会立即退出……这些似乎非常令人困惑。 为什么我要告诉计算机等待子进程完成然后立即告诉它如果没有孩子完成就立即退出? 有人可以解释这个选项和WUNTRACED选项吗? 我不知道被追查是什么意思。

waitpid()的示例正在使用中?

我知道waitpid()用于等待进程完成,但是如何才能完全使用它? 在这里我想要做的是,创造两个孩子并等待第一个孩子完成,然后在退出前杀死第二个孩子。 //Create two children pid_t child1; pid_t child2; child1 = fork(); //wait for child1 to finish, then kill child2 waitpid() … child1 { kill(child2) }

如何等待线程完成他们的工作,在c中克隆创建的线程?

我试着等待主要function,直到线程完成他们的工作。 但主要function完成其工作并退出。 我认为因为线程在变量中没有正确的指针/值。(理货和步骤) 在这种情况下,有人知道如何正确使用waitpid / wait吗? 我的代码: #define _GNU_SOURCE #include #include /* for PRIu64 and uint64_t */ /* you’ll need further includes */ #include #include #include “tally.h” #include #include #include #define STACK_SIZE 32768 #define THREADS 2 struct clone_args{ uint64_t steps; uint64_t* tally; }; int incHelper(void* arg){ struct clone_args *args = (struct clone_args*)arg; uint64_t steps= args->steps; […]

为什么wait()将状态设置为256而不是分叉进程的-1退出状态?

我正在尝试从子进程返回一个整数值。 但是,如果我使用exit(1),我得到256作为输出。 exit(-1)给出65280 。 有没有办法可以获得我从子进程发送的实际int值? if(!(pid=fork())) { exit(1); } waitpid(pid,&status,0); printf(“%d”,status); 编辑:使用exit(-1)(这是我真正想要的)我得到255作为WEXITSTATUS(状态)的输出。 它应该是未签名的吗?

使用系统调用fork()的多个管道实现execvp()wait()pipe() – 它根本不起作用

我需要实现处理多个管道命令的shell。 例如,我需要能够处理这个: ls | grep -i cs340 | sort | uniq | cut -c 5 ls | grep -i cs340 | sort | uniq | cut -c 5 ls | grep -i cs340 | sort | uniq | cut -c 5 。 我假设问题是我没有将前一个命令的输出传递给下一个命令的输入。 当我执行我的代码时,它没有给我输出。 我正在使用这个伪代码: for cmd in cmds if there is a next cmd […]