Tag: 处理

在虚拟shell中处理CTRL-C

我正在编写一个虚拟shell,当用户输入ctrl-C时它不应该终止,但是应该只生成一个新的提示行。 目前,当我输入ctrl-C时,我的shell不会终止,但它仍然不会打印新的提示行。 你知道为什么会这样,我怎么解决这个问题? 我的代码如下: #include #include #include #include #include #include #include #define BUFFER_SIZE 1<<16 #define ARRAY_SIZE 1<= &bufCmdArgs[cmdArgsSize])) break; } for (p=n=0; bufCmdArgs[n]!=NULL; n++){ if(strlen(bufCmdArgs[n])>0) cmdArgs[p++]=bufCmdArgs[n]; } *nargs=p; cmdArgs[p]=NULL; } void INThandler(int sig) { printf(“\n> “); signal(sig, SIG_IGN); } int main(void) { char buffer[BUFFER_SIZE]; char *args[ARRAY_SIZE]; int retStatus; size_t nargs; pid_t pid; printf(“$dummyshell\n”); signal(SIGINT, INThandler); […]

在C中遍历内核空间中的祖先的结束标志

我试图遍历进程的所有祖先,将其信息存储在用户传递的静态数组中,并且我使用NULL指针结束标志来结束遍历。 但是,这似乎不起作用,并且将继续循环,直到用户空间传递的大小编号(数组的容量)在所有情况下都匹配num_filed数字(数组中的元素数量),即使我有运行的进程数量很少。 那么,什么似乎是穿越祖先的结束标志? 这是我的遍历循环代码: current_process = current; int i = 0; while (current_process != NULL && current_num_filled parent; }

C信号处理程序被所有子进程激活

我需要某种signal_handler,当按下CTRL + C时,程序暂停所有操作并询问用户:«你确定要终止(Y / N)吗?»如果答案是y,程序终止,如果这是程序继续/升级它的function,这是我到目前为止所拥有的: void sig_handler(int sig){ if(sig == SIGINT){ char res; printf(“\nAre you sure you want to terminate (Y/N)?\n”); kill(0, SIGTSTP); //envia sinal Stop ao processo pai do{ read(STDIN_FILENO, &res, 1); if (res == ‘Y’ || res == ‘y’) { kill(0,SIGTERM); //envia sinal de Terminacao ao proceso pai }else if (res == ‘N’ […]

管道作为stdin / stdout进程通信。

我正在学习管道而且我遇到了问题。 我希望我的程序能够像: grep [word to find] [file to search] | grep -i [without word] | wc -l grep [word to find] [file to search] | grep -i [without word] | wc -l它编译并且没有错误地工作,但它没有输出(至少不在stdout上,因为我希望它做)。 奇怪的是,当我尝试在最后一个分叉中打印它时,它会在stdin上打印出来。 我没有改变这个叉子或parrent过程中的标准输出因此对我来说似乎很奇怪。 我正在尝试关闭未使用的管道并刷新stdout(它还在做什么吗?),但可能还有更多要做的事情。 #include #include #include void help() { printf( “Usage of the program:\n” “\t./alagrep [fileToSearch] [wordToFind] [wordToExpel]\n”); } int main(int argc, char […]

快速串口从处理写入Arduino

我需要一些帮助来加速写入串口。 我发现了一些类似的问题,但没有涉及处理语言或Java,所以我希望有人可以帮我解决这个问题。 编辑 正如John在下面指出的那样,看起来串行的速度还不够快,无法以我想要的速度发送这么多数据。 有谁知道其他可用的arduino接口? 结束编辑 我正在使用arduino来控制我连接的400个RGB LED的网格。 为了向arduino发送命令,我在Processing中编写了一个小程序来操作代表LED的大型数组。 然后我尝试通过串行发送800字节的数据,每隔20分钟以115200波特率向arduino发送更新网格。 每20ms调用的处理代码是: noStroke(); int dataPos = 0; // position in LED data array byte[] dataLedGrid = new byte[400*2]; // array for bytes to send for(int j=0; j<LEDS_TALL; j++) { for(int i=0; i<LEDS_WIDE; i++) { int pos = j*20+i; int r = ledGrid[LEDS_WIDE-i-1][LEDS_TALL-j-1][0], g = ledGrid[LEDS_WIDE-i-1][LEDS_TALL-j-1][1] ,b […]

子进程可以在没有父进程死亡的情况下吗?

杀 – 它会立即杀死这个过程吗? 我找到了答案,并为SIGCHLD设置了一个信号处理程序,并在该处理程序中引入了wait 。 这样,每当父进程终止子进程时,就会调用此处理程序并调用wait来获取子进程。 – 动机是清除进程表条目。 即使没有父进程死亡,我仍然会看到一些子进程持续几秒钟。 – 这怎么可能? 我通过ps看到这个。 准确地说ps -o user,pid,ppid,command -ax和greping for parent进程,子进程和defunct。

如何检查带有pid X的进程是否是一个僵尸?

我得到了一个进程的PID,我需要检查它是否是在C中使用POSIX系统调用的僵尸。我应该怎么做? 我遇到的问题是我有一个过程,它分叉给许多孩子,孩子们都做高管,有时我想在后台做exec,所以我不能等待()那些背景的孩子。 我可以定期等待(一次在我的主循环中),但我需要知道哪些进程是僵尸,所以我的父进程在等待不会很快结束的孩子时不会挂起。 如果你很好奇,我正在构建一个unix shell,并且它具有shell性质,让子进程异步执行。

零螺纹工艺?

进程是否必须至少包含一个线程? 进程是否可能没有任何线程,或者这没有意义?

使用管道在两个子进程之间进行通信

我正在尝试编写产生两个子进程的代码,这些进程通过管道相互发送消息然后终止。 但是,当我运行以下代码时,只有child2打印出问候语,但是子1仍然会打印从子2获取的消息,而子节点1则不会。 有人知道我的方法有什么问题吗? #include #include #include #include #include int main(int argc, char** argv) { char chld_1_send[20] = “hello from child 1”; char chld_1_recv[20]; char chld_2_send[20] = “hi from child 2”; char chld_2_recv[20]; int chld_1_outgoing[2]; int chld_2_outgoing[2]; pipe(chld_1_outgoing); pipe(chld_2_outgoing); int chld_1_status, chld_2_status; pid_t chld_1, chld_2; chld_1 = fork(); if(chld_1 == 0) { chld_2 = fork(); } […]

如何在C中正确等待我自己的shell中的前台/后台进程?

在上一个问题中,我发布了大部分自己的shell代码。 我的下一步是实现前台和后台进程执行并正确等待它们终止,这样它们就不会像“僵尸”那样停留。 在添加在后台运行它们的可能性之前,所有进程都在前台运行。 为此,我在使用execvp()执行任何进程后简单地调用wait(NULL)。 现在,我检查’&’字符作为最后一个参数,如果它在那里,通过不调用wait(NULL)在后台运行该进程,并且进程可以在后台运行愉快我将返回到我的shell。 这一切都正常(我认为),现在的问题是,我还需要以某种方式调用wait()(或waitpid()?),以便后台进程不会保持“僵尸”。 这是我的问题,我不知道该怎么做…… 我相信我必须处理SIGCHLD并在那里做一些事情,但是我还没有完全理解何时发送SIGCHLD信号,因为我还试图将wait(NULL)添加到childSignalHandler()但是它不起作用因为我一旦在后台执行了一个进程,调用了childSignalHandler()函数,因此等待(NULL),这意味着在“后台”进程完成之前我无法对我的shell做任何事情。 由于信号处理程序中的等待,它不再在后台运行。 我在这一切中缺少什么? 最后一件事,这个练习的一部分我还需要打印进程状态的变化,比如进程终止。 因此,对此的任何见解也非常感激。 这是我目前的完整代码: #include #include #include #include #include #include #include #include “data.h” // Boolean typedef and true/false macros void childSignalHandler(int signum) { // } int main(int argc, char **argv) { char bBuffer[BUFSIZ], *pArgs[10], *aPtr = NULL, *sPtr; bool background; ssize_t rBytes; int aCount; pid_t pid; […]