Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 即使我向子进程发送了SIGABRT,它也会正常退出_C_Linux - Fatal编程技术网

C 即使我向子进程发送了SIGABRT,它也会正常退出

C 即使我向子进程发送了SIGABRT,它也会正常退出,c,linux,C,Linux,我尝试了一些进程操作,比如fork()ing和exec()ing,我尝试了这个例子,在这个例子中,父进程等待他的子进程返回,并测试他的子进程是否正常结束(通过exit()ing或返回给调用方)或异常结束(接收信号,如SIGABRT) #包括 #包括 #包括 #包括 #包括 int spawn(字符*程序,字符**参数列表) { pid_t child_pid; child_pid=fork(); 如果(子pid!=0) 返回子对象; 否则{ execvp(程序、参数列表); 中止(); } }

我尝试了一些进程操作,比如fork()ing和exec()ing,我尝试了这个例子,在这个例子中,父进程等待他的子进程返回,并测试他的子进程是否正常结束(通过exit()ing或返回给调用方)或异常结束(接收信号,如SIGABRT)

#包括
#包括
#包括
#包括
#包括
int spawn(字符*程序,字符**参数列表)
{
pid_t child_pid;
child_pid=fork();
如果(子pid!=0)
返回子对象;
否则{
execvp(程序、参数列表);
中止();
}
}
int main()
{
国际儿童基金会地位;
char*arg_list[]={“ls”,“/”,NULL};
产卵(“ls”,arg_列表);
等待(&child_状态);
如果(妻子退出(子女身份))
printf(“子进程正常退出,退出代码为%d\n”,
妇女地位(儿童地位);
其他的
printf(“子进程异常退出\n”);
返回0;
}
我希望看到句子“子进程异常退出”,但我看到“子进程正常退出,退出代码为0”!!!即使子进程以调用abort()结束,该函数发送SIGABRT 有什么帮助吗?
提前感谢

当您调用
exec()
系列中的任何函数时,当前正在执行的程序将替换为调用
exec()
中指定的程序。这意味着永远不会调用
abort()
。因此,ls程序运行到completeion,然后正常退出。

当您调用
exec()
系列中的任何函数时,当前正在执行的程序将替换为调用
exec()
中指定的程序。这意味着永远不会调用
abort()
。因此ls程序运行到completeion,然后正常退出

#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<unistd.h>
#include <sys/wait.h>

int spawn (char* program, char** arg_list)
{
    pid_t child_pid;
    child_pid = fork ();
    if (child_pid != 0)
    return child_pid;

    else {
    execvp (program, arg_list);
    abort();
    }
}
int main ()
{
    int child_status;
    char* arg_list[] = {"ls","/",NULL};

    spawn ("ls", arg_list);

    wait (&child_status);


    if (WIFEXITED (child_status))
        printf ("the child process exited normally, with exit code %d\n",
        WEXITSTATUS (child_status));
    else
        printf ("the child process exited abnormally\n");
return 0;
}