Tag: 退出

父尝试读取子退出状态(或返回值),fork和wait

我糊涂了。 据说,基于man和许多其他来源,如下所示: 当操作系统终止你的进程等待(和状态) 时返回代码应该能让我获得子进程的退出状态或返回值吗? 那两段代码,应该让我看到它的孩子的退出值,然后打印出来。 子进程函数: int childFunction(char in[],char logPath[]){ FILE *logFile= fopen( logPath, “a” ); if(logFile==NULL) return 1; int c=system(in); fclose(logFile); return(c); } 主要: {…some unimportant code before this} result= fork(); if(result==0){ exit(childFunction(inLine,logPath)); } else if(result>0){ int status=0;; int c=(int)waitpid(-1,&status,0); printf(“a:%db:%d\n”,status, WIFEXITED(status)); else return -1; i=0; 我试着等待,睡了一段时间,退出,返回,并阅读手册页几次。 在我对这个function的理解中存在一个基本错误,或者在看了4个小时后我再也看不到它了。 已解决由于某些原因,我绝对不明白,如果你将childFunction中的return(c)更改为if(c!=)return(1);else return(0)它将起作用。 不知道为什么。 已解决2好的,现在我想我知道为什么。 看,似乎返回调用或等待将状态减少到8个最高有效位(256)。 那是什么意思? […]

是否可以成功包装退出方法?

我目前正在使用gcc 4.1.2并且我有一个用例,我想使用链接器选项来包装exit方法。 让我们立即抛开所有典型的回答/评论,“为什么你甚至想要那样做?” 我想知道的是,甚至可以做到这一点。 我之前使用链接器包装了其他方法,没有任何问题。 下面是我正在使用的__wrap_exit函数的快速示例: void __wrap_exit(int _status) { return; } 当调用exit时,确实调用了这个包装器。 但是,程序在__wrap_exit返回后立即遇到分段错误。 即使没有调用真正的退出函数并且只有包装器版本,gcc会在幕后做一些事情,例如在调用exit时发出信号吗? 可以提供幕后发生的一些细节吗?

分叉的子项以-1退出,但WEXITSTATUS获得255

我在孩子中以-1退出,但是父母选择了255。 有没有办法让父母识别-1而不是? 这是我的代码 pid = fork(); // if fork fails if (pid < 0){ exit(EXIT_FAILURE); } else if (pid == 0){ // purposely exit _exit(-1); } else{ int status; int corpse = wait(&status); if (WIFEXITED(status)) { int estat = WEXITSTATUS(status); if (estat == 0){ printf("Command was successfully executed\n"); } else{ printf("Error: child exited with status […]

C:程序退出时做某事

在C中,如果我的应用程序意外结束,我可以在此之前调用函数吗? 我正在向数据库(processRunning = 1)写入一个标志,以防止其他应用程序启动类似的进程。 当应用程序结束时,它不会改变该标志。

如何立即关闭C中的程序?

我正在编写C代码,我正在分析一些数据。 我已将程序设置为仅处理100个数据输入。 当它有超过100个输入时,它会产生分段错误。 我想创建一种方法,以便当输入数量超过100时,将警告用户并终止程序。 我知道如何通过简单地return 0从main函数中执行它,但是我是远离main的多个函数调用,并且很难做到这一点,即使在此函数中return 0也会使其循环。 是否有任何直接的方法来终止整个程序而不是主要的?

退出C中的function

C中的exit() ,_ exit( )和_Exit()有什么区别? 我该如何决定使用哪个? 在bash上, 男子2出口 给了我页面_EXIT(2),而 男子3出口 给了页面EXIT(3)。

是由程序员在exit()上解除分配吗?

我有一个程序,当我从键盘输入错误数据时,它只是退出exit(1) 。 我正在使用Valgrind进行测试,虽然发生这种情况但没有错误,但我可以看到仍有可达的x字节。 所以我的问题是:程序员在点击exit()或exit()操作系统exit()之前是否需要释放内存?

如何退出子进程并从execvp()返回其状态?

在我简单的自定义shell中,我正在从标准输入中读取命令并使用execvp()执行它们。 在此之前,我创建了当前进程的fork,我在该子进程中调用了execvp(),之后,我调用exit(0)。 像这样的东西: pid = fork(); if(pid == -1) { perror(“fork”); exit(1); } if(pid == 0) { // CHILD PROCESS CODE GOES HERE… execvp(pArgs[0], pArgs); exit(0); } else { // PARENT PROCESS CODE GOES HERE… } 现在,使用execvp()运行的命令可以返回错误吗? 我想正确地处理它,现在,我总是调用exit(0),这意味着子进程将始终具有“OK”状态。 如何从execvp()调用返回正确的状态并将其放入exit()调用? 我应该只获取execvp()返回的int值并将其作为exit()参数而不是0传递。这是否足够正确?

在退出()状态下使用C中的WEXITSTATUS宏超过256的任何好处?

我正在为大学做一个练习,我必须用退出返回一个值,这个值实际上是一些东西。 这可能高于255(exit()无法处理)但是老师建议使用测试数据,其中计数永远不会高于该值。 毕竟,我需要处理这个计数值,退出状态,我通过使用waitpid()在主进程中得到了这个值。 令我惊讶的是,如果子进程返回1,则主进程中的“实际”值为256,2为512,依此类推…… 我需要打印这个值,所以我简单地将它除以256并完成了。 但是,如果我使用WEXITSTATUS()宏,我也会按照我想要的方式得到这个值… 我查看了C源代码,这是我发现的: #define __WEXITSTATUS(status) (((status) & 0xff00) >> 8) 我理解这里发生了什么,例如,512 in binary是10 0000 0000,右移8 o将给00 0000 0010,即十进制2。 我在这个宏中不明白的是&运算符和0xff00似乎是一个随机数的事实(它可能不是,它来自哪里?)。 这究竟是做什么的,为什么宏中有“&0xff00”? 它不会有效吗? 在这个主题中真正的问题是,在我的代码中将此宏称为除以256是一回事吗?

从main调用pthread_exit可以吗?

当我从main调用pthread_exit时,程序永远不会终止。 我期望程序完成,因为我退出程序的唯一线程,但它不起作用。 好像挂了。 #include #include #include int main(int argc, char *argv[]) { printf(“-one-\n”); pthread_exit(NULL); printf(“-two-\n”); } Process Explorer显示(仅)线程处于Wait:DelayExecution状态。 根据pthread_exit文档: 在最后一个线程终止后,进程将以退出状态0退出。 行为应该就像实现在线程终止时调用带有零参数的exit()一样。 我正在使用Dev-C ++ v4.9.9.2和pthreads-win32 v2.8.0.0 (链接libpthreadGC2.a )。 该库似乎没问题(例如,从main调用pthread_self或pthread_create可以了)。 有什么理由说我不应该从main调用pthread_exit吗?