我想使用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);
}
答案 0 :(得分:0)
也许您的进程不在会话前台进程组中,尽管尝试读取或写入终端。
请参阅http://man7.org/linux/man-pages/man2/setpgid.2.html中的“备注”部分和http://www.linusakesson.net/programming/tty/中的“职位和会话”。
您还可以签入代码if (tcgetpgrp(STDOUT_FILENO) == getpgid(0))
。如果不是,那么你就不在前台。