setpgrp/setpgid失败(?),适用于Mac OSX,不适用于Linux

问题描述:

我试图编写一个程序来执行一个子命令,并且不允许该子项被Ctrl + C杀死。setpgrp/setpgid失败(?),适用于Mac OSX,不适用于Linux

我读过,我可以用setpgid/setpgrp完成此操作。

下面的代码工作在OSX,但在Linux(2.6.32,Ubuntu的10.04)运行像,

./a.out ls 

原因没有输出发生,程序不能SIGINT被杀死。

#include <unistd.h> 
#include <stdlib.h> 
#include <errno.h> 
#include <stdio.h> 

int main(int argc, char **argv) { 
    if (argc < 2) { 
     printf("Please provide a command\n"); 
     exit(1); 
    } 

    int child_pid = vfork(); 

    if (child_pid == 0) { 
     if (setpgrp() == -1) { 
      perror("setpgrp error"); 
      exit(1); 
     } 

     printf("Now executing the command:\n"); 

     argv++; 
     if (execvp(argv[0], argv) == -1) { 
      perror("Could not execute the command"); 
      exit(1); 
     } 
    } 

    int child_status; 
    wait(&child_status); 
} 

如果您注释掉对setpgrp的调用,您将看到其余代码正常工作。

我不得不修改代码的这一部分,以使它可以在两个平台上工作。我想这只是内核如何处理会话和进程组的差异。

if (setsid() == -1) { 
    #ifdef LINUX 
    perror("setsid error"); 
    exit(1); 
    #else 
    if (setpgrp() == -1) { 
     perror("setpgrp error"); 
     exit(1); 
    } 
    #endif 
} 
+0

**只是一个FYI **'setsid()'成功的OS X后,没有根在一个子进程完全fork后。基本上'vfork'复制了一些东西,但流程环境结构在两者之间共享(几乎就像一个进程和一个线程之间的混合)......它意味着fork/exec产卵的速度更快,其中复制环境是浪费精力。 (为什么是的,我们确实在大学的MINUX 2中实现了'vfork',感谢提问;)) – Barry 2016-04-14 01:00:58