免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2532 | 回复: 3
打印 上一主题 下一主题

kill掉子进程后,主进程就down了 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-01-01 20:31 |只看该作者 |倒序浏览
if(strcmp(line,"0")==0)
            {
                sprintf(cmd,"kill %d",pid);
                system(cmd);
                printf("exec::00000000000\n");
                //pid = system("spcaview -w 10.10.19.129:7070 &");
                pid = system("/home/lyt/servfox -g -d /dev/video0 -l  -w 7070 &");
                printf("pid = %d\n",pid);
            }
            else if(strcmp(line,"1")==0)
            {
                sprintf(cmd,"kill %d",pid);
                system(cmd);
                printf("exec::11111111111\n");
                pid = system("/home/lyt/servfox -g -d /dev/video1 -l  -w 7070 &");
                printf("pid = %d\n",pid);
            }
这样kill掉子进程后,主进程就down了
理论上也是这样吗??
其实这也相当于发了一个kill-SIGKILL pid的信号啊?有没有什么好的办法?当system(cmd);的时候,只是子进程over而主进程依然运行。


谢谢!!

论坛徽章:
0
2 [报告]
发表于 2009-01-01 23:39 |只看该作者

回复 #1 ipromiseu 的帖子

线程的思维方式比较合理

论坛徽章:
0
3 [报告]
发表于 2009-01-02 08:57 |只看该作者
fork()一个子进程来做system

  1. if(fork() == 0)
  2. {
  3.    system("XXX");
  4. }
复制代码

论坛徽章:
0
4 [报告]
发表于 2009-01-02 18:02 |只看该作者

有问题,线程一执行,怎么完全替代了主进程了,

用pthread好像不行,看一下如下处理,有问题,线程一执行,怎么完全替代了主进程了,主进程后面的东西都没有执行了:


/* File: server.c */

#include <stdio.h>
#include <pthread.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>


char* cmdtemp[6];
char* cmdtemp1[6];


int thread_flag = 0;//flag to exit pthread
//two pthread to start servfox process
void* thread_spcaview(void)
{
        execvp(cmdtemp[0],&cmdtemp[0]);
        printf("start spcaview-0 pthread ok \n");
        if(thread_flag)
        {
                pthread_exit(NULL);       
        }
}
void* thread_spcaview1(void)
{
        execvp(cmdtemp1[0],&cmdtemp1[0]);
        printf("start spcaview-1 pthread ok \n");       
        if(thread_flag)
        {
                pthread_exit(NULL);       
        }
}

int main(int argc, char **argv)
{
        int fd;
        int address_len;
        struct sockaddr_in address;
        pthread_t thread_id;
        int ret;
        cmdtemp[0] = "spcaview";
        cmdtemp[1] = "-l";
        cmdtemp[2] = "-d";
        cmdtemp[3] = "/dev/video0";
        cmdtemp[4] = "&";

        cmdtemp1[0] = "spcaview";
        cmdtemp1[1] = "-l";
        cmdtemp1[2] = "-d";
        cmdtemp1[3] = "/dev/video0";
        cmdtemp1[4] = "&";       

        //pid_t pid,pid2;
        /*************************       
        if((pid = fork())<0)
        {
                perror("cannot create the new process");
                return -1;
        }
        else if(pid ==0)
        {
                execvp(cmdtemp[0],&cmdtemp[0]);       
        }
        if(pid2>0)
        {
                pid =pid2;       
                printf("child pid = %d\n",pid);               
                //execvp(cmdtemp[0],&cmdtemp[0]);                                                                       
        }       
        //pid = system("/home/lyt/servfox -g -d /dev/video0 -l  -w 7070 &");
        ***************************/


        fd = socket(AF_INET, SOCK_DGRAM, 0);        //SOCK_DGRAM
       
        bzero(&address, sizeof(address));
        address.sin_family = AF_INET;
        address.sin_addr.s_addr = htonl(INADDR_ANY);
        address.sin_port = htons(5555);
        address_len = sizeof(address);
        bind(fd, (struct sockaddr *)&address, address_len);

        ret = pthread_create(&thread_id,NULL,(void*)thread_spcaview,NULL);
        if(ret==-1)
        {
                //peeror("cannot create new thread");
                return -1;       
        }
       
        while(1) {
                struct sockaddr_in client_address;
                socklen_t len = sizeof(client_address);
                int n;
                char line[80];
                char cmd[20]="";       
                printf("waiting...\n");

                n = recvfrom(fd, line, 80, 0, (struct sockaddr *)&client_address, &len);
                //printf("server received %d:%s\n", n, line);
                if(n)
                {//kill the old process to switch the channel
                       
                        if(strcmp(line,"0")==0)
                        {
                               
                                //printf("pid = %d\n",pid);
                                //sprintf(cmd,"kill -9 %d",pid);
                                //system(cmd);
                                printf("exec::00000000000\n");
                                //pid = system("spcaview -w 10.10.19.129:7070 &");
                                //pid = system("/home/lyt/servfox -g -d /dev/video0 -l  -w 7070 &");
                                /************************
                                if((pid2 = fork())<0)
                                {
                                        perror("cannot create the new process");
                                        return -1;
                                }
                                else if(pid2 ==0)
                                {
                                        execvp(cmdtemp[0],&cmdtemp[0]);       
                                        printf("I am in child pid\n");
                                }
                                if(pid2>0)
                                {
                                        pid =pid2;       
                                        system(cmd);
                                        printf("child pid = %d\n",pid);               
                                        //execvp(cmdtemp[0],&cmdtemp[0]);                                                                       
                                }
                                ***************************/
                                thread_flag = 1;
                                sleep(2);
                                thread_flag = 0;                                                               
                                ret = pthread_create(&thread_id,NULL,(void*)thread_spcaview,NULL);
                                if(ret==-1)
                                {
                                        //peeror("cannot create new thread");
                                        return -1;       
                                }

                        }
                        else if(strcmp(line,"1")==0)
                        {
                                //printf("pid  = %d\n",pid);
                                //sprintf(cmd,"kill -9 %d",pid);
                                //system(cmd);                       

                                printf("exec::11111111111\n");
                                //pid = system("/home/lyt/servfox -g -d /dev/video1 -l  -w 7070 &");
                                /*******************************
                                if((pid2 = fork())<0)
                                {
                                        perror("cannot create the new process");
                                        return -1;
                                }
                                else if(pid2 ==0)
                                {
                                        execvp(cmdtemp[0],&cmdtemp[0]);       
                                        printf("I am in child pid\n");
                                }
                                if(pid2>0)
                                {
                                        pid =pid2;
                                        printf("child pid = %d\n",pid);       
                                        //execvp(cmdtemp[0],&cmdtemp[0]);                       
                                }
                                                               
                                *****************************************/
                                thread_flag = 1;
                                sleep(2);
                                thread_flag = 0;                                                               
                                ret = pthread_create(&thread_id,NULL,(void*)thread_spcaview1,NULL);
                                if(ret==-1)
                                {
                                        //peeror("cannot create new thread");
                                        return -1;       
                                }                               
                        }
                        else
                        {
                                printf("exec::no such dev\n");
                        }
                }
               

                //send data to client
                //sendto(fd, line, n, 0, (struct sockaddr *)&client_address, len);
        }
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP