Извиняюсь за предыдущий пост, ночью голова плохо работает. Вот с исправлениями(правда как сделать отступы не знаю:
Есть программа которая порождает дочерний процесс и из него передает родительскому привет. Задача стоит в том чтобы изменить код дочернего процесса и сделать его отдельной программой и вызвать через exec. Ниже привожу код с заданием и переработанный мною. Просьба исправить что не так и не сильно пинать, поскольку я никогда не писал на С а тем более под линукс .
Исходный текст
#include "myheader.h"
FILE *stream;
int main() {
pid_t child_pid;
char filename[] = "/tmp/myprogram.XXXXXX";
int fd;
printf("Parent: The main program's PID is %u\n", (unsigned int) getpid());
/* Создает временный файл. */
fd = mkstemp(filename);
if (fd < 0)
{
fprintf(stderr, "Parent: Can't create temporary file:" " %s\n",strerror(errno));
exit(EXIT_FAILURE);
}
stream = fdopen(fd, "r+");
if (stream == NULL) { fprintf(stderr, "Parent: Can't create stream for" " temporary file %s: %s\n", filename, strerror(errno));
exit(EXIT_FAILURE);
}
if (unlink(filename) < 0) fprintf(stderr, "Parent: Error unlinking temporary file" " %s: %s\n", filename, strerror(errno));
/* Создает дочерний процесс. */
child_pid = fork();
if (child_pid != 0)
{
/* Это родительсий процесс */
if (child_pid == -1)
{
/* Ошибка при созд. дочернего процесса. */
fprintf(stderr, "Parent: Error creating a child:" " %s\n",strerror(errno));
exit(EXIT_FAILURE);
}
exit(parent(child_pid));
}
else
{
/* Это дочений оцес */ exit(child());
}
}
------------------------------
/* * parent.c * */
#include "myheader.h"
enum { MSGSIZE = 20 };
extern int parent(pid_t child_pid) {
int child_status;
char message[MSGSIZE];
assert(child_pid > 0);
assert(stream != NULL);
printf("Parent: My PID is %u and my child's PID is %u\n", (unsigned int) getpid(), (unsigned int) child_pid);
wait(&child_status);
printf("Parent: Child exited with code %d\n", child_status);
if (fseek(stream, 0, SEEK_SET) != 0)
{
fprintf(stderr, "Parent: Error seeking in temporary file:" "%s\n", strerror(errno));
return 1;
}
if (fgets(message, MSGSIZE, stream) == NULL)
{
if (ferror(stream))
{ fprintf(stderr, "Parent: Error reading from" " temporary file: %s\n", strerror(errno));
return 1;
}
printf("Parent: No message from child" " has been received\n");
return 0;
}
printf("Parent: A message from child has been received:\n" "%s\n", message);
return 0;
}
-------------------------------------------------- /* * child.c * */
#include "myheader.h"
extern int child() { assert(stream != NULL);
printf("Child: My PID is %u and my parent's PID is %u\n", (unsigned int) getpid(), (unsigned int) getppid());
if (fputs("Hello, Daddy!", stream) == EOF)
{
fprintf(stderr, "Child: Error writing to temporary file:" " %s\n", strerror(errno));
return 1;
}
return 0;
}
А вот переделанный код. Код parent.c Я оставил без изменений
/* * main2.c * * */
#include "myheader.h"
FILE *stream;
int main()
{ pid_t child_pid;
char filename[] ="/tmp/myprogram.XXXXXX";
int fd;
printf("Parent: The main program's PID is %u\n", (unsigned int)getpid());
fd = mkstemp(filename);
if (fd < 0) {
fprintf(stderr, "Parent: Can't create temporary file:" " %s\n",strerror(errno));
exit(EXIT_FAILURE);
}
stream = fdopen(fd, "r+");
if (stream == NULL)
{ fprintf(stderr, "Parent: Can't create stream for" " temporary file %s: %s\n", filename, strerror(errno));
exit(EXIT_FAILURE);
}
if (unlink(filename) < 0) fprintf(stderr, "Parent: Error unlinking temporary file" " %s: %s\n", filename, strerror(errno));
child_pid = fork();
if (child_pid != 0)
{
if (child_pid == -1)
{
fprintf(stderr, "Parent: Error creating a child:" " %s\n",strerror(errno));
exit(EXIT_FAILURE);
}
exit(parent(child_pid));
}
else
{
execl ("/bin/example2", "example2", (char*) 0);
}
}
----------------------------
/* * child2.c * */
#include "myheader.h"
int main()
{
pid_t child_pid;
char filename[] = "/tmp/myprogram.XXXXXX";
int fd;
stream = fopen(filename, "r+");
if (stream == NULL)
{
fprintf(stderr, "Child: Can't create stream for" " temporary file%s: %s\n", filename, strerror(errno));
exit(EXIT_FAILURE);
}
if (unlink(filename) < 0)
fprintf(stderr, "Child: Error unlinking temporary file" " %s: %s\n",filename, strerror(errno));
printf("Child: My PID is %u and my parent's PID is %u\n", (unsigned int) getpid(), (unsigned int) getppid());
if (fputs("Hello, Daddy!",stream) == EOF)
{
fprintf(stderr, "Child: Error writing to temporary file:" " %s\n",strerror(errno));
}
}