Это первый раз, когда я столкнулся с ошибкой сегментации 11 в C, и я, похоже, не склоняю голову о том, что на самом деле происходит неправильно.Ошибка сегментации 11 строка печати из структуры
Что я пытаюсь сделать, это написать несколько значений int для структуры плюс имя файла из командной строки (char *) из дочернего процесса, а затем записать структуру в трубу для чтения из родительского обработать. Он отлично работает, когда это только целые числа, и я вынимаю код, работающий со строкой, но как только я добавляю в строку и пытаюсь распечатать имя файла в родительском процессе, я получаю ошибку сегментации 11 при запуске программы.
Я просмотрел различные сообщения со всех сторон, но заметил, что общая проблема заключается в том, что кто-то пытается назначить строку массиву символов и печатает, но я обязательно использовал только char * здесь. Вот код, где он блокирует
if((read(pd[0], &pv, 2048)) == -1)
{
error_exit("read not working");
}
printf("words = %d\n", pv.words);
printf("lines = %d\n", pv.lines);
printf("bytes = %d\n", pv.bytes);
printf("file = %s\n", pv.file); //locks up here and gives segmentation fault 11 on the command line
Вот прочитанный из того, что делает программа, когда я запускаю его:
$ ./a testfile
Parent process... should be waiting on child...
In child process! pid = 21993
it worked? testfile
Done with child process!
words = 1
lines = 2
bytes = 3
Segmentation fault: 11
Также здесь полный код EDIT: Я выгружена код используя sizeof для струн и использованные strlen
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
void error_exit(char *);
typedef struct total {
int words, lines, bytes;
char *file;
} Vals;
int main(int argc, char *argv[])
{
int pd[2]; //pipe descriptor
pid_t pid;
Vals v, pv;
char *fname = "Not set";
if(argc > 1)
{
fname = malloc(strlen(argv[1]));
strcpy(fname, argv[1]);
}
if((pipe(pd)) == -1)
{
error_exit("pipe creation");
}
if((pid = fork()) == -1)
{
error_exit("the fork forked up!");
}
else if(pid == 0)
{
printf("In child process! pid = %d\n", getpid());
v.words = 1;
v.lines = 2;
v.bytes = 3;
v.file = malloc(strlen(fname));
strcpy(v.file, fname);
printf("it worked? %s\n", v.file);
close(pd[0]);
if((write(pd[1], &v, sizeof(v.words) + sizeof(v.lines) + sizeof(v.bytes) + strlen(v.file))) == -1)
{
error_exit("Write from child");
}
//return; //return from child
printf("Done with child process!\n");
close(pd[1]);
return 0;
}
else
{
printf("Parent process... should be waiting on child...\n");
}
//wait for child
while((pid = wait(NULL)) > 0);
close(pd[1]);
//Vals pv = {0, 0, 0, "pv.file not set"};
//just assign anything to file to see if it fixes
//pv.file = malloc(strlen(fname));
if((read(pd[0], &pv, 2048)) == -1)
{
error_exit("read not working");
}
printf("words = %d\n", pv.words);
printf("lines = %d\n", pv.lines);
printf("bytes = %d\n", pv.bytes);
printf("file = %s\n", pv.file); //locks up here and gives segmentation fault 11 on the command line
close(pd[0]);
//program ended normally
return 0;
}
void error_exit(char *err)
{
printf("exiting because of this section: %s\nerrno = %d", err, errno);
exit(1);
}
Я очень благодарен за понимание!
Я думаю, что вы хотите 'strlen (v.file)' вместо 'sizeof (v.file)'. – fvu
О да, это делает жизнь намного проще :) Я изменил это на протяжении всего кода, но все равно получаю ошибку сегментации. Я заметил, что перед родительским чтением из канала, если я делаю pv.file = malloc (strlen (fname)); то он не даст мне ошибку сегментации, но печатает пустую строку. –
тоже, 'размерof (argv [1])', такой же проблема. И 'fname = argv [1];' вероятно, также не делает того, что вы хотите. Попробуйте 'strcpy'. – fvu