gdb内で些細なプログラムを実行すると、それがクライアントをforkしexeclする。 execl行(gdb内の下位2の内部)は、プロセスIDに "新しいプログラムを実行しています"と表示し、すぐにエラーを検出します。その時点まで些細なCプログラムのexec segfault
コードは、次のとおりです。
int main(int argc, char *argv[]) {
/* Create socket pair for communication with server, and fork/exec the server code */
int ret;
int fd[2];
ret = socketpair(AF_LOCAL, SOCK_STREAM | SOCK_NONBLOCK, 0, fd);
if(ret < 0) {
perror("Unable to create initial socketpair for qrServer");
return -1;
}
pid_t pid = fork();
if (pid == 0) {
char arg[4];
bzero(arg, 4);
close(fd[1]);
sprintf(arg, "%d", fd[0]);
char* filename = "child";
ret = execl(filename, filename, arg, NULL);
をちょうど完全を期すために、以下のように、子プログラムが開始されます:
int main(int argc, char *argv[]) {
/* Create socket pair for communication with server, and fork/exec the server code */
if(argc < 2) {
perror("Usage: argv[0] <file descriptor>");
任意のアイデア?私は何も手に入らず、ただそのseg障害自体と私はすぐにそれを得る。 man execl
から
ワンセグ障害を取得するソース行が何であるべきか? –
'arg [4]'は十分大きくありません。また、 'snprintf(arg、sizeof(arg)、"%d "、fd [0])'を使用してこの種のフォールトを回避する習慣を習得してください。 –
@SteveSummit "* ...は十分ではありません。" 2つのFDの期待値が "3"と "4"であるため、おそらくそうではありません。 – alk