Стартиране на програма от друга програма в езика С
9 отговора
467 прегледа
Стартиране на програма от друга програма в езика С
Значи става дума за програмиране на С.
Как може по време на изпълнението на данена програма от нея да се стартира друга с аргументи и след като втората се прекрати, действието да се върне обратно към първата.
Благодаря ви предварително!
Как може по време на изпълнението на данена програма от нея да се стартира друга с аргументи и след като втората се прекрати, действието да се върне обратно към първата.
Благодаря ви предварително!
Re: Стартиране на програма от друга програма в езика С
Ти май си решил форума да го използваш за online help...
Виж във "нормалния хелп" execve() функцията и нейните приятелки... те са десетина.... айде успех.
Виж във "нормалния хелп" execve() функцията и нейните приятелки... те са десетина.... айде успех.
Re: Стартиране на програма от друга програма в езика С
Кога ще се научите да задавате въпросите като хората?
За коя операционна система? Щото за всяка е различно.
Ако е за Виндовса, виж WinExec (), също ShellExecute(), ShellExecuteEx();
За ДОС: exec...(), много са, за разни ситуации.
За linux също: execl, execlp, execle, execv, execvp, а така също и fork ();
За X-Windows вече не помня...
За коя операционна система? Щото за всяка е различно.
Ако е за Виндовса, виж WinExec (), също ShellExecute(), ShellExecuteEx();
За ДОС: exec...(), много са, за разни ситуации.
За linux също: execl, execlp, execle, execv, execvp, а така също и fork ();
За X-Windows вече не помня...
Re: Стартиране на програма от друга програма в езика С
izpolzwai spawn() ili exec() - w zawisimost kakvo ti trjabwa - dali iskash da produlzhish dejstwie sled kato programata ti se e wurnala - ili puk da ja pusnesh konkurentno..
i dvete funkcii sus razlichnite im varianti - wish Helpa - F1 - gi ima za wsischki OS i rabotjat dosta dobre... ne ti trjabwa Win32 specific neshta :)
Um tzaruwa, Um robuwa, Um belia delfin
i dvete funkcii sus razlichnite im varianti - wish Helpa - F1 - gi ima za wsischki OS i rabotjat dosta dobre... ne ti trjabwa Win32 specific neshta :)
Um tzaruwa, Um robuwa, Um belia delfin
Re: Стартиране на програма от друга програма в езика С
$ man spawn
No manual entry for spawn
spawn go niama za wsichki OS :P
No manual entry for spawn
spawn go niama za wsichki OS :P
Re: Стартиране на програма от друга програма в езика С
Става дума за ДОС. И ощи приди до зодом въпроса разгледах хелпа и разбрах за споменатите по-горе функции. И понеже ми трябваше като се прекрати новостартираната програма старата да продължи от мястото на стартиране на новата програма избрах функцията spawn....
Да обаче имам няколко проблема с използването и и.
По-надалу съм показал как я използвам - получават ми се два проблема.
1. Понякога не се стартира втората програма,а функцията perror("error: ") докладва за грешка свързана с недостатъчно памет - а основната програма е съвсем кратка и не използва много памет. Ако във сорса по долу има още стотина реда, които съм махна, тъйкато те само подготвят текстовия файл, който ще бъде отворен от новостартираната програма, тогава съобщението за грешка свързано сд недостиг на памет не се появява и подпрограмата си се стартира нормално.
2. Винаги след приключване на основната програма се появява съобщението: Null pointer assignment. На какво се дължи това съобщение. Знам само че идва от функцията spawn... Нещо от параметрите ли? Даже и да е с NULL параметри освен ивето на подпрограмата пак дава това съобщение.
Ето къде използвам тази функция:
void old_kredit_pregled(long KlnNo, char *filename)
{
char file[10];
strcpy(file, filename); //filename = "3";
strcat(file, ".tmp");
/* тук има код, който запълва текстов хайл с името 3.tmp
с текст, който файл ще бъде отворен посредством
програмката readme.com */
spawnl(P_WAIT, "readme.com", "", file);
perror("error: ");
}
Да обаче имам няколко проблема с използването и и.
По-надалу съм показал как я използвам - получават ми се два проблема.
1. Понякога не се стартира втората програма,а функцията perror("error: ") докладва за грешка свързана с недостатъчно памет - а основната програма е съвсем кратка и не използва много памет. Ако във сорса по долу има още стотина реда, които съм махна, тъйкато те само подготвят текстовия файл, който ще бъде отворен от новостартираната програма, тогава съобщението за грешка свързано сд недостиг на памет не се появява и подпрограмата си се стартира нормално.
2. Винаги след приключване на основната програма се появява съобщението: Null pointer assignment. На какво се дължи това съобщение. Знам само че идва от функцията spawn... Нещо от параметрите ли? Даже и да е с NULL параметри освен ивето на подпрограмата пак дава това съобщение.
Ето къде използвам тази функция:
void old_kredit_pregled(long KlnNo, char *filename)
{
char file[10];
strcpy(file, filename); //filename = "3";
strcat(file, ".tmp");
/* тук има код, който запълва текстов хайл с името 3.tmp
с текст, който файл ще бъде отворен посредством
програмката readme.com */
spawnl(P_WAIT, "readme.com", "", file);
perror("error: ");
}
Re: Стартиране на програма от друга програма в езика С
da ne bi "poniakoga" e kogato imash goliam tekstow file?
kato se wika towa spawn... kakwo stawa s heap pametta?
zashto se otkaza da si pishesh sobstwen view za tekstow file?
kato se wika towa spawn... kakwo stawa s heap pametta?
zashto se otkaza da si pishesh sobstwen view za tekstow file?
Re: Стартиране на програма от друга програма в езика С
Отказах се защото нямам време. Трябва ми програмката да стане бързичко. Както и да е с отваряне на допълнителна програма за преглеждане на текстови файлове проблема частично се реши. Частично, защото тази програмка не ми допада много много. Ще си напиша и собствена, но понататък. За сега единствения ми проблем остава че когато възникне хардуерна грешка тя се поема от функция включена в основната програма, но спряма новостартираната програма се държи странно - в смисъл, че работи но визуално на екрана не се появява това което трябва, а някаква мацаница. Сложни работи. Още съм далеч от тях. Дано да се науча някой ден.
Re: Стартиране на програма от друга програма в езика С
wsyshtnost malyk pod Win32 problema ne e tolkowa triwialen ako iskash da startirash proizwolna aplikacia i chakash da se wyrne shtoto tia moje da spawne drugi procesi i da zatwori glawnia (installshield naprimer)...za taia cel sym si wdianal edin lek debugger deto sledi tia neshta :)
dimd00d
PS. Pozdrawi na Asenia
dimd00d
PS. Pozdrawi na Asenia
Re: Стартиране на програма от друга програма в езика С
mda - prav si - eto go nashia kod za reformatora na GNU/C++ suobshteniata do takiva na MSVC:
Um tzaruwa, Um robuwa, Um belia delfin
/* error_convert.cpp
*
* mangles gcc's error messages to look more like visual studio's error messages.
*
* Usage:
* in your makefile, send gcc and all of its parameters to ec as command line arguments.
* your rule might look something like:
*
* .cpp.o:
* ec $(CC) $(CXXFLAGS) $(TMPFLAGS) $(INCDIR) -c $< -o $*.o
*/
#include <windows.h>
#include <process.h>
#include <memory.h>
#include <string.h>
#include <stdio.h>
#include <fcntl.h>
#include <io.h>
#include <ctype.h>
#include <list>
using namespace std;
#define ERR_BUFF_SIZE 2048
#define READ_HANDLE 0
#define ERROR_HANDLE 1
char szBuffer[ERR_BUFF_SIZE];
list< char* > message;
/*
<path>/<file>:<line>: <msg> <fullpath>/<file>(<line>): <msg>
In file included from <path1>/<file1>:<line1>: <fullpath2>/<file2>(<line2>): <msg>: included from:
<path2>/<file2>:<line2>: <msg> <fullpath1>/<file1>(<line1>)
In file included from <path1>/<file1>:<line1>, <fullpath3>/<file3>(<line3>): <msg>; included from
from <path2>/<file2>:<line2>: <fullpath1>/<file1>(<line1>): included from
<path3>/<file3>:<line3>: <msg> <fullpath2>/<file2>(<line2>)
*/
void Reformat( char* msg )
{
// isolate the file specifier
char* cp = strchr( msg, ':' );
if( cp )
{
if( *(cp+1)=='\\' || *(cp+1)=='/' )
{
cp = strchr( cp+1, ':' );
}
if( cp && isdigit(*(cp+1)) )
{
// convert to full path spec
*cp++ = 0;
char file[ERR_BUFF_SIZE];
_fullpath( file, msg, ERR_BUFF_SIZE );
// extract the line number
char* cp2 = strpbrk( cp, ":," );
if( cp2 )
{
*cp2++ = 0;
char line[ERR_BUFF_SIZE];
strncpy( line, cp, ERR_BUFF_SIZE );
if( *cp2 )
{
char err[ERR_BUFF_SIZE];
strncpy( err, cp2, ERR_BUFF_SIZE );
sprintf( msg, "%s(%s):%s", file, line, err );
}
else
{
sprintf( msg, "%s(%s)", file, line );
}
}
}
}
}
int Filter( char* szBuf, ULONG nSize )
{
// const strings for pattern matching
const char INCLUDED_FROM_STRING[] = "In file included from ";
const char FROM_STRING[] = " from ";
// accumulate buffer until we reach end of line
char* bufEnd = szBuf + nSize;
char* pos = szBuf;
static char msgline[ERR_BUFF_SIZE];
static char* msgfill = msgline;
while( pos < bufEnd )
{
while( pos<bufEnd && *pos!='\n' )
{
*msgfill++ = *pos++;
}
if( pos < bufEnd )
{
*(msgfill-1) = 0;
msgfill = msgline;
pos++;
// check message line format
if( strncmp(msgline,INCLUDED_FROM_STRING,sizeof(INCLUDED_FROM_STRING)-1) == 0 )
{
// this is an include specifier
strcpy( msgline, msgline+sizeof(INCLUDED_FROM_STRING)-1 );
Reformat( msgline );
message.push_back( strdup(msgline) );
}
else if( strncmp(msgline,FROM_STRING,sizeof(FROM_STRING)-1) == 0 )
{
// this is an include specifier
strcpy( msgline, msgline+sizeof(FROM_STRING)-1 );
Reformat( msgline );
message.push_back( strdup(msgline) );
}
else
{
// this the actual error message
Reformat( msgline );
message.push_front( strdup(msgline) );
// now print out the result
if( message.size() > 1 )
{
fprintf( stderr, "\n%s; included from\n", message.front() );
free( message.front() );
message.pop_front();
while( message.size() > 1 )
{
fprintf( stderr, "\t%s: included from\n", message.front() );
free( message.front() );
message.pop_front();
}
fprintf( stderr, "\t%s:\n", message.front() );
free( message.front() );
message.pop_front();
}
else
{
fprintf( stderr, "%s\n", message.front() );
free( message.front() );
message.pop_front();
}
}
}
}
return 1;
}
int main( int argc, char** argv )
{
int nExitCode = STILL_ACTIVE;
if( argc >= 2 )
{
HANDLE hProcess;
int hStdErr;
int hStdErrPipe[2];
// Create the pipe
if( _pipe(hStdErrPipe,512,O_BINARY|O_NOINHERIT) == -1 )
return 1;
// Duplicate stderr handle (next line will close original)
hStdErr = _dup( _fileno(stderr) );
// Duplicate write end of pipe to stderr handle
if( _dup2(hStdErrPipe[ERROR_HANDLE],_fileno(stderr)) != 0 )
return 2;
// Close original write end of pipe
close( hStdErrPipe[ERROR_HANDLE] );
// Spawn process
hProcess = (HANDLE)spawnvp( P_NOWAIT, argv[1], (const char* const*)&argv[1] );
// Duplicate copy of original stderr back into stderr
if( _dup2(hStdErr,_fileno(stderr)) != 0 )
return 3;
// Close duplicate copy of original stderr
close( hStdErr );
if( hProcess != (HANDLE)-1 )
{
int nErrRead;
while( nExitCode == STILL_ACTIVE )
{
nErrRead = read( hStdErrPipe[READ_HANDLE], szBuffer, ERR_BUFF_SIZE );
if( nErrRead )
{
nErrRead = Filter( szBuffer, nErrRead );
}
if( !GetExitCodeProcess(hProcess,(unsigned long*)&nExitCode) )
return 4;
}
}
else
{
int i;
char cmdline[ 1024 ] = "";
for( i=1; i<argc; i++ )
{
strcat( cmdline, argv );
if( i != argc - 1 )
strcat( cmdline, " " );
}
fprintf( stderr, "%s: error spawning: \"%s\"\n", argv[0], cmdline );
}
}
return nExitCode;
}
Um tzaruwa, Um robuwa, Um belia delfin