linux-c-programming.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* Re: How to execute a process in background by exec functions?
@ 2004-04-11 17:37 Jose Luis Alarcon Sanchez
  2004-04-11 17:05 ` John T. Williams
  0 siblings, 1 reply; 8+ messages in thread
From: Jose Luis Alarcon Sanchez @ 2004-04-11 17:37 UTC (permalink / raw)
  To: linux-c-programming; +Cc: jowillia

---- Begin Original Message ----
running a process in the background simply means not waiting for it to
complete.  So a parent process that wanted to make a child process run
ls in the ´background¡ would do something like this: (again this should
be treated as sudo code that just looks a lot like C)

_______________________CODE__________________
int
main (int argC, char** argV) {
int bg = 1;  // test condition for running in the background
int pid; 
int status;

if( (pid = fork()) ==  0 )   {
	/* child code starts here */
	execl(´/bin/ls¡, ´/bin/ls¡, 0 ); 

} else {
	/* this is the critical point, if you call wait, the parent 	process
stops until the child process returns, which would be fg 	behavior (at
least in a shell).  If the 
	parent doesn't call wait (or waitpid), then both parent and 	child will
run at the same time. (i.e. The child runs in the 	background */ 
	if( !bg) {  
		wait(&status);
	}
	/* Parent Code Starts here */
}

return 0;
}
_________________________END CODE_____________________

There are also considerations about input and output, and bringing the
process from the background to the forground, and sending it back into
the background, and so forth.  If your really interested in how this
works and how to address the more complex issues, I suggest that you
read the source code for GNU BASH, which is freely available (at this
point everyone must think I'm a spokes person for GNU)  or Read the
O'Reilly books "Learning the bash Shell, 2nd Edition", and "Practical
C Programming, 3rd Edition"
---- End Original Message ----


  Hi John.

  I am trying compile the code you paste in your message,
but i get an error with the line

execl(´/bin/ls¡, ´/bin/ls¡, 0 );

Process_Exec.c:15:11: warning: character constant too long for its type
Process_Exec.c: In function `main':
Process_Exec.c:15: error: `bin' undeclared (first use in this function)
Process_Exec.c:15: error: (Each undeclared identifier is reported only
once
Process_Exec.c:15: error: for each function it appears in.)
Process_Exec.c:15: error: stray '\241' in program
Process_Exec.c:15: error: `ls' undeclared (first use in this function) 

  I'm afraid that it is for the character before the '/',
i can't get it with any key. But i am not sure, i am a very 
newbie C programmer.

  I hope you can help me.

  Thanks, very much, in advance.

  Regards.

  Jose.


http://www.lordofunix.org

FreeBSD RELEASE 5.2.
Mandrake Linux 9.2 Kernel 2.6.2 XFS.
Registered BSD User 51101.
Registered Linux User #213309.
Memories..... You are talking about memories. 
Rick Deckard. Blade Runner.


Get your Free E-mail at http://bunniwerks.zzn.com
___________________________________________________________
Get your own Web-based E-mail Service at http://www.zzn.com
-
To unsubscribe from this list: send the line "unsubscribe linux-c-programming" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 8+ messages in thread
* Re: How to execute a process in background by exec functions?
@ 2004-04-11 19:23 Jose Luis Alarcon Sanchez
  0 siblings, 0 replies; 8+ messages in thread
From: Jose Luis Alarcon Sanchez @ 2004-04-11 19:23 UTC (permalink / raw)
  To: jowillia; +Cc: linux-c-programming

---- Begin Original Message ----
The single quotes need to be double quotes 
so the call should look like 

execl("/bin/ls", "ls", 0);  
---- End Original Message ----


  Now it works fine!

  Thanks you very much, John. You're very kind.

  Regards.

  Jose.


http://www.lordofunix.org

Registered Linux User #213309.
Memories..... You are talking about memories. 
Rick Deckard. Blade Runner.


Get your Free E-mail at http://bunniwerks.zzn.com
___________________________________________________________
Get your own Web-based E-mail Service at http://www.zzn.com

^ permalink raw reply	[flat|nested] 8+ messages in thread
[parent not found: <3AA03342E913FA4BA6D8BD0732BFC74B05530BA8@pdsmsx402.pd.intel.com>]
* c++ compiling problem. undefined reference to main
@ 2004-04-06 20:44 srg
  2004-04-08  5:41 ` How to execute a process in background by exec functions? Wen Guangcheng
  0 siblings, 1 reply; 8+ messages in thread
From: srg @ 2004-04-06 20:44 UTC (permalink / raw)
  To: linux-c-programming

Hello:

We have a problem compiling c++ code.
At the bottom of this message you can see the compiler error.

Here are the details:

# gcc -v
Reading specs from /usr/lib/gcc-lib/i486-linux/3.3.3/specs
Configured with: ../src/configure -v 
--enable-languages=c,c++,java,f77,pascal,objc,ada,treelang --prefix=/usr 
--mandir=/usr/share/man --infodir=/usr/share/info 
--with-gxx-include-dir=/usr/include/c++/3.3 --enable-shared 
--with-system-zlib --enable-nls --without-included-gettext 
--enable-__cxa_atexit --enable-clocale=gnu --enable-debug 
--enable-java-gc=boehm --enable-java-awt=xlib --enable-objc-gc i486-linux
Thread model: posix
gcc version 3.3.3 (Debian)

# g++ -v
Reading specs from /usr/lib/gcc-lib/i486-linux/3.3.3/specs
Configured with: ../src/configure -v 
--enable-languages=c,c++,java,f77,pascal,objc,ada,treelang --prefix=/usr 
--mandir=/usr/share/man --infodir=/usr/share/info 
--with-gxx-include-dir=/usr/include/c++/3.3 --enable-shared 
--with-system-zlib --enable-nls --without-included-gettext 
--enable-__cxa_atexit --enable-clocale=gnu --enable-debug 
--enable-java-gc=boehm --enable-java-awt=xlib --enable-objc-gc i486-linux
Thread model: posix
gcc version 3.3.3 (Debian)

# cat hello.cpp
#include <iostream>

using namespace std;

int main(int argc,char** argv)
{
cout << "hello" << endl;
}
# g++ -o hello hello.cpp
# ./hello
hello

At this point all is OK, now comes the problem:

# cat cj_enteros.hpp

#ifndef _CJ_ENTEROS_HPP_
#define _CJ_ENTEROS_HPP_

#include <iostream>

class cj_enteros {

public:
cj_enteros(void);
cj_enteros(const cj_enteros& B);

~cj_enteros(void);

void inserta (int);

void unir (const cj_enteros& B);
void intersectar (const cj_enteros& B);
void restar (const cj_enteros& B);

bool contiene (int e) const;
int max (void) const;
int min (void) const;
int card (void) const;

cj_enteros& operator=(const cj_enteros& B);

bool operator== (const cj_enteros& B) const;
bool operator!= (const cj_enteros& B) const;

void print (ostream& os);

private:
struct node {
node* next;
int info;
};
node* pri;
node* copia_conj(node* p);
void esb_conj(node* p);
node* ordenar_creciente(node* p);
};


#endif

# cat cj_enteros.cpp
#include "cj_enteros.hpp"

cj_enteros::cj_enteros(void) {
pri = NULL;
}

cj_enteros::cj_enteros(const cj_enteros& B) {
pri = copia_conj(B.pri);
}

cj_enteros::node* cj_enteros::copia_conj(node* p) {
if(p == NULL) return NULL;
else {
node * n = new node;
n -> info = p -> info;
p = p -> next;
n -> next = copia_conj(p);
return n;
}
}

void cj_enteros::esb_conj(node* p) {
if(p == NULL) return ;
else {
esb_conj(p -> next);
delete p;
}
}

cj_enteros::~cj_enteros(void) {
esb_conj(pri);
}

bool cj_enteros::contiene(int e) const {
node* aux = pri;
while(aux != NULL && aux -> info != e) {
aux = aux -> next;
}
if(aux == NULL) return false;
else return true;
}

int cj_enteros::max (void) const {
if(pri == NULL) return 0;
else if(pri -> next == NULL) return pri -> info;
else {
node* n = pri -> next;
node* max = pri;
while(n != NULL) {
if(n -> info > max -> info) {
max = n;
}
n = n -> next;
}
return max -> info;
}
}

int cj_enteros::min (void) const {
if(pri == NULL) return 0;
else if(pri -> next == NULL) return pri -> info;
else {
node* n = pri -> next;
node* min = pri;
while(n != NULL) {
if(n -> info < min -> info) {
min = n;
}
n = n -> next;
}
return min -> info;
}
}

int cj_enteros::card (void) const {
node* n = pri;
int i = 0;
if(n == NULL) return 0;
else {
while(n != NULL) {
n = n -> next;
i++;
}
return i;
}
}


/*void cj_enteros::inserta(int e) {
if(!contiene(e)) {
if(pri == NULL) {
node* n = new node;
pri = n;
n -> info = e;
pri -> next = NULL;
}
else {
node* n = new node;
node* aux = pri -> next;
pri -> next = n;
n -> info = e;
n-> next = aux;
}
}
}*/

void cj_enteros::inserta(int e) {
if(!contiene(e)) {
if(pri == NULL) {
node* n = new node;
pri = n;
n -> info = e;
pri -> next = NULL;
}
else {
node* n = pri;
bool insertat = false;
while(n -> next != NULL && !insertat){
if((n -> info < e) && ((n -> next) -> info > e)) { // s'inserta al mig
node* aux = new node;
node* aux2 = n -> next;
n -> next = aux;
aux -> next = aux2;
aux -> info = e;
insertat = true;
}
else if(n -> info < e && (n -> next) -> info < e) { // avan? n
n = n -> next;
}
else if(n -> info > e) {
node* aux = new node;
aux -> next = n;
aux -> info = e;
pri = aux;
insertat = true;
}
}
if(!insertat) {
if(n -> info < e) {
node* aux = new node;
n -> next = aux;
aux -> info =e;
aux -> next = NULL;
}
else {
node* aux = new node;
pri = aux;
pri -> next = n;
aux -> info = e;
}
}
}
}
}

/*void cj_enteros::unir (const cj_enteros& B) {
node* n = pri;
while(n -> next != NULL) n = n -> next;
n -> next = B.pri;
}*/
void cj_enteros::unir (const cj_enteros& B) {
node* n = B.pri;
while(n != NULL) {
inserta(n -> info);
n = n -> next;
}
}

bool cj_enteros::operator== (const cj_enteros& B) const {
if(card() != B.card()) return false;
else {
node* aux = pri;
node* aux2 = B.pri;
while(aux != NULL && (aux -> info == aux2 -> info)) {
aux = aux -> next;
aux2 = aux2 -> next;
}
if(aux == NULL) return true;
else return false;
}
}

void cj_enteros::print (ostream& os) {
node* aux;
//aux = ordenar_creciente(pri);
aux = pri;
cout << "[";
while(aux != NULL) {
os << " " << aux -> info;
aux = aux -> next;
}
cout << "]" << endl;
}

// ----------------------------------------------------------

# g++ -o cj_enteros cj_enteros.cpp
/usr/lib/gcc-lib/i486-linux/3.3.3/../../../crt1.o(.text+0x18): In 
function `_start':
../sysdeps/i386/elf/start.S:98: undefined reference to `main'
collect2: ld returned 1 exit status

Any ideas?

Thanks and best regards


^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2004-04-11 23:02 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-04-11 17:37 How to execute a process in background by exec functions? Jose Luis Alarcon Sanchez
2004-04-11 17:05 ` John T. Williams
2004-04-11 23:02   ` Glynn Clements
  -- strict thread matches above, loose matches on Subject: below --
2004-04-11 19:23 Jose Luis Alarcon Sanchez
     [not found] <3AA03342E913FA4BA6D8BD0732BFC74B05530BA8@pdsmsx402.pd.intel.com>
2004-04-08  9:31 ` Wen Guangcheng
2004-04-06 20:44 c++ compiling problem. undefined reference to main srg
2004-04-08  5:41 ` How to execute a process in background by exec functions? Wen Guangcheng
2004-04-08  8:56   ` Glynn Clements
2004-04-08 13:25   ` John T. Williams

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).