🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.c
Article #359

RE: Ktos wie jak to sie robi???

#359
From: Slon
Date: Mon, 24 Nov 1997 17:33
82 lines
2975 bytes
On Mon, 24 Nov 1997, Krzysztof Murkowski wrote:

> Tomasz Grabowski wrote:
> > 
> > Mam jakis ciag znakow  *argvc[]  - niech to bedzie np. nazwa pliku
> > "plik.txt". Teraz chcialbym (pod Unixem) aby moj program odpalil np.
> > program "vi" wraz z ta nazwa "plik.txt". Ktos wie jak to sie robi???
> 
> #include <stdlib.h>
> ...
> char string[100];
> ...
> system( strcat(strcpy( string, "/usr/bin/vi "), argvc[0] ) );
> 
> -- 
> Krzysztof Murkowski
> mailto:murek@ml.put.poznan.pl
> http://www.ml.put.poznan.pl/~murek
> 

Ok, tyle, ze jezeli to "*argvc[]" jest drugim parametrem main()
to argvc[0] jest nazwa pliku programu, a nie parametrem "plik.txt" !

Tomek - "*argvc[]" jest tablica wskazan do ??? ( zapewne 'char' ),
	wiec musisz wiedziec, ktory z tych stringow ma byc parametrem
	dla vi. Jezeli cala tablica argvc ma byc przekazana, to oczywiscie
	mozna posklejac linie wywolania, tak jak to pokazal Krzysztof, ale
	jest to ciutke niewygodne, bo trudno okreslic statycznie rozmiar
	'char string[???]', tak aby go nie przepelnic !

Przy zalozeniu ze chodzi o uruchomienie vi z parametrami wywolania
programu rodzicielskiego, zaproponowal bym Ci raczej cos takiego:

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

#define  PROG   "/usr/bin/vi"

...

int main ( int argc, char * argv[] )
{ pid_t pid;
  int rval;
  int ret;

  ...

  switch (pid=fork())
  {
    case -1 : /* Proces rodzicielski - padl fork() */
              ret=-1;
              break;
    case  0 : /* Proces potomny - uruchom PROG */
              argv[0]=PROG;
              execv(PROG,argv);
              return errno;
    default : /* Proces rodzicielski - czekaj na zakonczenie 'pid' */
              ret=waitpid(pid,&rval;0);
              break;
  }
  /* W tym miejscu jeseli 'ret!=-1', mozesz sprawdzac
   * kod powrotu z procesu potomnego przy pomocy makr 
   * wstat(5) ! To bedzie kod z PROG jeseli execv()
   * wykonal sie poprawnie ! Jezeli 'ret==-1' to albo
   * padl fork() albo waitpid() zostal przerwany z 
   * innego, niz zakonczenie procesu 'pid', powodu
   * ( np. sygnalem ).
   */

  ...

}

Oczywiscie fork() ma sens tylko, gdy jest cos do zrobienia po wykonaniu 
edycji przy pomocy vi, waitpid() jest potrzebne tylko wtedy, gdy program
rodzicielski musi czekac na zakonczenie edycji, itd ...

Pozdrowienia ...				Slon

  
Technical Details
Message-ID: <Pine.LNX.3.95.971124182912.15179B-100000@astro.coig.katowice.pl>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!pingwin.icm.edu.pl!mat.uni.torun.pl!uw.edu.pl!lublin.pl!news.onet.pl!astro.coig.katowice.pl!slon

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!pingwin.icm.edu.pl!mat.uni.torun.pl!uw.edu.pl!lublin.pl!news.onet.pl!astro.coig.katowice.pl!slon
From: Slon <slon@astro.coig.katowice.pl>
Newsgroups: pl.comp.lang.c
Subject: RE: Ktos wie jak to sie robi???
Date: Mon, 24 Nov 1997 18:33:46 +0100
Organization: poorly-installed news reader
Lines: 83
Message-ID: <Pine.LNX.3.95.971124182912.15179B-100000@astro.coig.katowice.pl>
NNTP-Posting-Host: astro.coig.katowice.pl
Mime-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 7bit