Hello,

Distro : Debian 10 - 64bits

I think it's the right list ; if not, please redirect me.

In order to launch a command from within the C programme in attachment, I use "fork - execve - wait" trio so that parent program waits until command has finished

Building the program : cc execve.c -o execve

Program syntax : ./execve <command full path>

Example : ./execve /usr/bin/gvim

*The problem* :

--- if I execute "./execve /usr/bin/gvim", gvim starts after a few seconds but without executing .vimrc, and parent program doesn't wait for gvim to end.

Output of "ps -auwx --forest" during the few wait seconds :

lgentis   5216  0.0  0.0   7124  3812 pts/0    Ss   14:47 0:00  \_ bash
lgentis   9368  0.0  0.0   2144   752 pts/0    S+   16:44 0:00  |   \_ ./execve /usr/bin/gvim lgentis   9369  2.0  0.2  68916 16452 pts/0    S+   16:44   0:00 |       \_ gvim lgentis   9392  2.5  0.3  71620 22444 ?        Ss   16:44 0:00  |           \_ gvim

Output of "ps -auwx --forest" once gvim started :

lgentis   5212  0.1  0.7 426212 43880 ?        Rl   14:47    0:07 xfce4-terminal
lgentis   5216  0.0  0.0   7124  3812 pts/0    Ss+  14:47   0:00  \_ bash
lgentis   9093  1.3  0.4  75804 26700 ?        Ss   16:36     0:00 gvim

We can see that  gvim is not a child process of the parent program (which has ended)

--- if I execute "./execve /usr/bin/vim.gtk", *vim* starts in text mode in the console ; however, parent program waits till vim is closed.

Output of "ps -auwx --forest"  :

lgentis   5212  0.0  0.7 426212 43880 ?        Rl   14:47 0:06 xfce4-terminal
lgentis   5216  0.0  0.0   7124  3812 pts/0    Ss   14:47 0:00  \_ bash
lgentis   9011  0.0  0.0   2144   748 pts/0    S+   16:34 0:00  |   \_ ./execve /usr/bin/vim.gtk lgentis   9012  0.8  0.2  68932 17232 pts/0    S+   16:34   0:00 |       \_ vim.gtk

 We can see that  vim.gtk is a child process of the parent program

--- I did the same test with gedit and audacious, and all works fine :  child program is executed and parent program waits as expected.

Output of "ps -auwx --forest" :

lgentis   5212  0.0  0.7 425664 43548 ?        Sl   14:47 0:05 xfce4-terminal
lgentis   5216  0.0  0.0   7124  3812 pts/0    Ss   14:47 0:00  \_ bash
lgentis   8910  0.0  0.0   2144   748 pts/0    S+   16:30 0:00  |   \_ ./execve /usr/bin/gedit lgentis   8911  4.2  0.7 477720 47812 pts/0    Sl+  16:30   0:00 |       \_ gedit

We can see that  gedit is a child process of the parent program

--
--
You received this message from the "vim_use" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- You received this message because you are subscribed to the Google Groups "vim_use" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_use/33f1ec41-bcaa-c77c-408d-9d16643a6b5e%40waika9.com.
/* execve.c */

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <libgen.h>

// argv[1] doit contenir le chemin complet du programme à lancer (/usr/bin/gvim par exemple)
int main(int argc, char *argv[]) {

	char *newargv[5];
	char *newenviron[5];
	newargv[0] = basename(argv[1]);
	newargv[1] = NULL;
	newenviron[0] = "DISPLAY=:0.0";
	newenviron[1] = NULL;
	pid_t  pid;

	// Clonage du parent
	pid = fork();

	if (pid == 0) {
		// On est dans le clone
		// Remplacement du clone par la commande shell ou le programme
		execve (argv[1],newargv,newenviron );
	} else {
		// On est dans le parent
		// On attend la fin du programme
		wait(NULL);
		puts ("This is a message from the parent");
	}
		
}

Reply via email to