使用sudo启动程序

时间:2013-07-25 11:40:03

标签: c linux sudo

我想使用sudo启动一个程序,我已经使用了这个命令

sudo './ConnectionManager'

在a:

Distributor ID: ScientificSL
Description:    Scientific Linux SL release 5.5 (Boron)
Release:        5.5
Codename:       Boron
(Like Centos5.5)

它可以工作,但它不起作用

Distributor ID: Scientific
Description:    Scientific Linux release 6.4 (Carbon)
Release:        6.4
Codename:       Carbon

在最后一种情况下,我立即得到以下消息: [1] +停止sudo'./ConnectionManager'

我检查了代码,问题是ConnectionManager中的指令int setpgrp(void)

ConnectionManager是一个用C编写的程序,为了等待tcp / ip连接,它会分叉一个进程。

有人可以帮助我吗?

按照示例代码

#include <stdio.h>
#include <ncurses.h>
...
int main()
{

    if (chdir("/opt/informix/server") == -1)
{
  printf("Errore nella directory /opt/informix/server\n");
  getch();  
  exit(1);    
};


    signal(SIGINT, onexit);
    signal(SIGUSR1, RefreshMainWindow);

signal(SIGPIPE, SIG_IGN);
signal(SIGCLD, SIG_IGN);
setpgrp();

ParentPid = getpid();



/***/
if (LockFile(_true) != _ok)
{     
  exit(1);
}

if (CreateDestroyShm(_true) != _ok)
{   
  exit(1);
}

    ...

    if (LockFile(_false, &sdebug) != _ok)
{   
  exit(1);
}


/***/

init_curses();      
menubar  = subwin(stdscr, 1, MAXCOLS, 0, 0);
main_win = subwin(stdscr, MAXROWS-1, MAXCOLS, 1, 0);
cbreak();           /* immediately acquire each keystroke */
PrintTestata();
draw_menubar(menubar);

/***/



switch (fork())
{
  case 0:
    signal(SIGUSR1, SIG_IGN);
  break;
  default:     

   KeyboardHandler();
}


    void init_curses()
    { 

  putenv("TERM=xterm");

      initscr();
      wresize(stdscr, MAXROWS, MAXCOLS);
      start_color();
      init_pair(1,COLOR_WHITE,COLOR_RED);
      init_pair(2,COLOR_BLUE,COLOR_WHITE);
      init_pair(3, COLOR_GREEN, COLOR_BLUE);
      init_pair(4, COLOR_RED, COLOR_BLUE);
      curs_set(0);
      noecho();
      keypad(stdscr,TRUE);
      touchwin(stdscr);
      wrefresh(stdscr);  
  }

1 个答案:

答案 0 :(得分:0)

也许您的进程不在会话前台进程组中,尽管尝试读取或写入终端。

请参阅http://man7.org/linux/man-pages/man2/setpgid.2.html中的“备注”部分和http://www.linusakesson.net/programming/tty/中的“职位和会话”。

您还可以签入代码if (tcgetpgrp(STDOUT_FILENO) == getpgid(0))。如果不是,那么你就不在前台。