co tutaj jest źle ? :)

0

[code]
#include <stdio.h>
#include <unistd.h>
#define PROCFILE "/usr/plik.txt"
#define PROC "/bin/ps"
#define SIZE 4096
main(int argc, char *argv[])
{
int out;
char buff[SIZE];
FILE *plik;

out = dup(1); close(1);

plik = fopen(PROCFILE,"w");
if ( fileno(plik) !=1) {

dup2(fileno(plik),1);
}
execvp(PROC,argv);
fclose(plik);
dup2(out,1);
system("ls");
}
[/code]

Czemu wynik funkcji system(); nie pokazuje się, tj program się odpala, i nic się nie dzieje, a powinien pokazać ls danego katalogu :), może mi ktoś powiedzieć czemu tak jest ? :)

pozdro jgr

0

Zamiast execvp uzyj system !!!
execvp podmienia calowicie wszystkie segment programu ktory ja wywolal (przy okazji dziedziczy deskryptory - dlatego w pliku masz uotput wywolania ps !!). I dlatego tez po wykonaniu polecenia ps nowy kod segment kodu programu dochodzi do konca ;) i program sie konczy !!
Natomiast system to inaczej fork -> exec -> wait czyli potomek ktory odziedziczy deskryptory skopiuje a nie nadpisze segmentu programu do swojej przestrzeni adresowej i po wykonaniu sie powroci do ojca , ktory bedzie mogl dokonczyc swoj stary kod !!

[code]
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#define PROCFILE "/usr/plik.txt"
#define PROC "/bin/ps"
#define SIZE 4096
main(int argc, char *argv[])
{
int out;
char buff[SIZE];
FILE *plik;

out = dup(1); close(1);

plik = fopen(PROCFILE,"w");
if ( fileno(plik) !=1) {
dup2(fileno(plik),1);
}
system(PROC);
// fclose(plik); zbyteczne bo i tak dup2 zamknie otwarta 1-ke czyli ten plik !!
dup2(out,1);
system("ls");
}
[/code]

No to terzaz juz wszystko jasne [diabel]

1 użytkowników online, w tym zalogowanych: 0, gości: 1