X-Recipient: archive-cygwin AT delorie DOT com X-SWARE-Spam-Status: No, hits=-1.3 required=5.0 tests=AWL,BAYES_00,RP_MATCHES_RCVD,SPF_NEUTRAL X-Spam-Check-By: sourceware.org Message-ID: <4E906DD1.50107@cornell.edu> Date: Sat, 08 Oct 2011 11:35:45 -0400 From: Ken Brown User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:7.0.1) Gecko/20110929 Thunderbird/7.0.1 MIME-Version: 1.0 To: cygwin Subject: Problem redirecting stderr to pipe in subprocess Content-Type: multipart/mixed; boundary="------------020800010209010403050509" X-IsSubscribed: yes Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: cygwin-owner AT cygwin DOT com Mail-Followup-To: cygwin AT cygwin DOT com Delivered-To: mailing list cygwin AT cygwin DOT com --------------020800010209010403050509 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit The attached STC arose from my attempt to understand the problem discussed starting in http://cygwin.com/ml/cygwin/2011-09/msg00405.html . I'm starting a new thread because there appears to be a Cygwin problem having nothing to do with emacs. The STC creates a pipe and then runs `bash -ic ls' in a subprocess, with both stdout and stderr sent to the pipe. The parent process reads from the pipe and echoes it to the terminal. On Linux, I first get the error messages (presumably expected) bash: cannot set terminal process group (-1): Invalid argument bash: no job control in this shell followed by the directory listing. On Cygwin, the bash process produces no output but is simply stopped, and I have to kill it from another terminal before the main program will exit. This happens both with cygwin-1.7.9 and the latest snapshot. Here are a few comments: 1. The problem disappears if I don't send bash's stderr to the pipe. 2. The problem also disappears if I replace -ic by -c in the call to bash, presumably because there's nothing sent to stderr in that case. 3. The problem disappears if I don't use a pipe but just have the bash subprocess write to the terminal, even if I redirect bash's stderr to stdout. Ken --------------020800010209010403050509 Content-Type: text/plain; name="bash-ls.c" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="bash-ls.c" #include #include int main() { char *argv[4]; char buf; int fd[2]; pid_t pid; pipe (fd); argv[0] = "bash"; argv[1] = "-ic"; argv[2] = "ls"; argv[3] = '\0'; pid = fork(); if (pid == 0) { setsid (); close (1); close (2); dup2 (fd[1], 1); dup2 (fd[1], 2); close (fd[1]); execvp (argv[0], argv); } else { close (fd[1]); while (read (fd[0], &buf, 1) > 0) write (1, &buf, 1); close (fd[0]); } } --------------020800010209010403050509 Content-Type: text/plain; charset=us-ascii -- Problem reports: http://cygwin.com/problems.html FAQ: http://cygwin.com/faq/ Documentation: http://cygwin.com/docs.html Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple --------------020800010209010403050509--