鱼C论坛

 找回密码
 立即注册
查看: 2818|回复: 11

程序 在函数中未退出 红色的地方未执行。

[复制链接]
发表于 2021-11-13 23:30:03 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 liyiqi 于 2021-11-14 09:41 编辑
#include <unistd.h>
#include <iostream>
#include <string>
#include <signal.h>
#include <sys/wait.h>
#include <sys/types.h>

using namespace std;

pid_t childPid_1;
pid_t childPid_2;
int i = 1;
bool j = true;

/*处理信号函数*/
void cap(int signum);
void process_cap1 (int signum);
void process_cap2 (int signum);

int main(int argc,char *arg[])
{
      
        int pfd[2];
        char buf[1024];
        string send1 = "I send you ";
        string send2 = " time";
        string send;
        /*创建匿名管道*/
        if(pipe(pfd) == -1){
                cout << "创建失败" << endl;
        } else {
         cout << "创建管道成功" << endl;
        }
      
        childPid_1 = fork ();

        if (childPid_1 < 0){
                cout << "创建失败" << endl;
        } else {
                if (childPid_1 == 0){
                //忽略SIGINT
                signal (SIGINT,SIG_IGN);
                cout << "创建子进程——1成功  " ;
                childPid_1 = getpid ();
                cout << "ppid  "
                     << getppid()  
                     << "  pid  "
                     << getpid()
                     << endl;
                while (i){
                        /*执行子进程-1操作**/
                        send = send1+to_string(i);
                        send += send2;
                        const char* s = send.c_str();
                        i++;
                        write(pfd[1],s,1024);
                        /* 每发送一次 休眠一秒*/
                        sleep(1);
                        //捕捉父进程的信号,退出循环
                        if (signal(SIGUSR1,process_cap1) == SIG_ERR){
                                 cout << "error";
                        }
                       
                       
                }
                       
                       

                        cout << "Child Process 1 is killed by Parent" <<
                        endl;
                        exit(0);
        } else {
                //sleep(5);
                /*执行父进程创建子进程-2操作*/
                childPid_2 = fork();
                if (childPid_2 < 0){
                        cout <<  "创建失败" << endl;
                } else if (childPid_2 == 0){
                        //忽略SIGINT
                         signal (SIGINT,SIG_IGN);
                              
                        cout << "创建子进程——2成功" ;
                        childPid_2 = getpid();
                        cout << "  ppid  "
                             << getppid()
                             << "  pid  "
                             << getpid()
                             << endl;
                        /*执行子进程-2操作**/
                        while (j){
                                read(pfd[0],buf,1024);
                                cout << buf << endl;      
                                //捕捉父进程信号
                                if (signal (SIGUSR2,process_cap2) == SIG_ERR)  {
                                        cout << "error";
                                }
                                if (j == false){
                                        break;
                                }
                                       
                        }                              

                        cout << "Child Process 2 is killed by Parent!" <<  endl;
                        exit (0);
                       

                } else {
                        /*执行来自用户的操作 ctrl+c */
                         signal (SIGINT,cap);
                       
                        while (true);

                }
        }
        }
      
}

void cap (int signum)
{
        cout << getpid()
             << "进程"
             << "捕捉到SIGINT信号"
             << endl;
        kill (childPid_1,SIGUSR1);
        waitpid (childPid_1,NULL,0);

        kill (childPid_2,SIGUSR2);
        waitpid (childPid_2,NULL,0);
      
                       
        cout << "Parent Process is killed";
        signal(SIGINT,SIG_DFL);
}

void process_cap1 (int signum){
               
        cout << getpid()
             << "进程"
             << "捕捉到SIGUSR1信号"
             << endl;
        //将 i 设置为负数 退出while
        i = -1;
}

void process_cap2 (int signum){
        cout << j;
        j = false;
        cout << getpid()
             << "进程"
             << "捕捉到SIGUSR2信号"
             << endl;[i][/i]
        cout << j;
        return ;
}
2021-11-13 19-50-30 的屏幕截图.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-11-13 23:31:31 | 显示全部楼层
是最后一个函数的后两条语句
没有标上,不好意思
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-13 23:43:49 | 显示全部楼层

回帖奖励 +5 鱼币

重新发一下代码,用代码格式发,像这样
你要标注代码的话,用图片的形式标
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-13 23:56:16 | 显示全部楼层

不太会用这个论坛
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-13 23:58:37 | 显示全部楼层
liyiqi 发表于 2021-11-13 23:56
不太会用这个论坛

Untitled.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-13 23:59:19 | 显示全部楼层
本帖最后由 liyiqi 于 2021-11-14 00:03 编辑
#include <unistd.h>
#include <iostream>
#include <string>
#include <signal.h>
#include <sys/wait.h>
#include <sys/types.h>

using namespace std;

pid_t childPid_1;
pid_t childPid_2;
int i = 1;
bool j = true;

/*处理信号函数*/
void cap(int signum);
void process_cap1 (int signum);
void process_cap2 (int signum);

int main(int argc,char *arg[])
{
       
        int pfd[2];
        char buf[1024];
        string send1 = "I send you ";
        string send2 = " time";
        string send;
        /*创建匿名管道*/
        if(pipe(pfd) == -1){
                cout << "创建失败" << endl;
        } else {
         cout << "创建管道成功" << endl;
        }
       
        childPid_1 = fork ();

        if (childPid_1 < 0){
                cout << "创建失败" << endl;
        } else {
                if (childPid_1 == 0){
                //忽略SIGINT
                signal (SIGINT,SIG_IGN);
                cout << "创建子进程——1成功  " ;
                childPid_1 = getpid ();
                cout << "ppid  "
                     << getppid()  
                     << "  pid  "
                     << getpid()
                     << endl;
                while (i){
                        /*执行子进程-1操作**/
                        send = send1+to_string(i);
                        send += send2;
                        const char* s = send.c_str();
                        i++;
                        write(pfd[1],s,1024);
                        /* 每发送一次 休眠一秒*/
                        sleep(1);
                        //捕捉父进程的信号,退出循环
                        if (signal(SIGUSR1,process_cap1) == SIG_ERR){
                                 cout << "error";
                        }
                       
                       
                }
                       
                       

                        cout << "Child Process 1 is killed by Parent" <<
                        endl;
                        exit(0);
        } else {
                //sleep(5);
                /*执行父进程创建子进程-2操作*/
                childPid_2 = fork();
                if (childPid_2 < 0){
                        cout <<  "创建失败" << endl;
                } else if (childPid_2 == 0){
                        //忽略SIGINT
                         signal (SIGINT,SIG_IGN);
                               
                        cout << "创建子进程——2成功" ;
                        childPid_2 = getpid();
                        cout << "  ppid  "
                             << getppid()
                             << "  pid  "
                             << getpid()
                             << endl;
                        /*执行子进程-2操作**/
                        while (j){
                                read(pfd[0],buf,1024);
                                cout << buf << endl;       
                                //捕捉父进程信号
                                if (signal (SIGUSR2,process_cap2) == SIG_ERR)  {
                                        cout << "error";
                                }
                                if (j == false){
                                        break;
                                }
                                       
                        }                               

                        cout << "Child Process 2 is killed by Parent!" <<  endl;
                        exit (0);
                       

                } else {
                        /*执行来自用户的操作 ctrl+c */
                         signal (SIGINT,cap);
                       
                        while (true);

                }
        }
        }
       
}

void cap (int signum)
{
        cout << getpid()
             << "进程"
             << "捕捉到SIGINT信号"
             << endl;
        kill (childPid_1,SIGUSR1);
        waitpid (childPid_1,NULL,0);

        kill (childPid_2,SIGUSR2);
        waitpid (childPid_2,NULL,0);
       
                       
        cout << "Parent Process is killed";
        signal(SIGINT,SIG_DFL);
}

void process_cap1 (int signum){
               
        cout << getpid()
             << "进程"
             << "捕捉到SIGUSR1信号"
             << endl;
        //将 i 设置为负数 退出while
        i = -1;
}

void process_cap2 (int signum){
        cout << j;
        j = false;
        cout << getpid()
             << "进程"
             << "捕捉到SIGUSR2信号"
             << endl;
        cout << j;
        return ;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-14 14:12:19 | 显示全部楼层

回帖奖励 +5 鱼币

帮顶
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-14 14:30:20 | 显示全部楼层

回帖奖励 +5 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-14 20:14:29 | 显示全部楼层
回复别人要点 "回复" 按钮,不然别人是收不到通知的,除非别人主动点进来。
#include <iostream>
#include <signal.h>
#include <string>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

using namespace std;

pid_t childPid_1;
pid_t childPid_2;
int i = 1;
bool j = true;

/*处理信号函数*/
void cap(int signum);
void process_cap1(int signum);
void process_cap2(int signum);

int main(int argc, char *arg[]) {

    int pfd[2];
    char buf[1024];
    string send1 = "I send you ";
    string send2 = " time";
    string send;
    /*创建匿名管道*/
    if(pipe(pfd) == -1) {
        cout << "创建失败" << endl;
    } else {
        cout << "创建管道成功" << endl;
    }

    childPid_1 = fork();

    if(childPid_1 < 0) {
        cout << "创建失败" << endl;
    } else {
        if(childPid_1 == 0) {
            //忽略SIGINT
            signal(SIGINT, SIG_IGN);
            // //捕捉父进程的信号,退出循环
            //捕捉父进程的信号
            if(signal(SIGUSR1, process_cap1) == SIG_ERR) {
                cout << "error";
            }
            cout << "创建子进程——1成功  ";
            childPid_1 = getpid();
            cout << "ppid  " << getppid() << "  pid  " << getpid() << endl;
            while(i) {
                /* 每发送一次 休眠一秒*/
                sleep(1);
                /*执行子进程-1操作**/
                send = send1 + to_string(i);
                send += send2;
                //const char *s = send.c_str();
                i++;
                //write(pfd[1], s, 1024);
                write(pfd[1], send.c_str(), send.size());
                /* 每发送一次 休眠一秒*/
                //sleep(1);
            }

            cout << "Child Process 1 is killed by Parent" << endl;
            exit(0);
        } else {
            // sleep(5);
            /*执行父进程创建子进程-2操作*/
            childPid_2 = fork();
            if(childPid_2 < 0) {
                cout << "创建失败" << endl;
            } else if(childPid_2 == 0) {
                //忽略SIGINT
                signal(SIGINT, SIG_IGN);
                //捕捉父进程信号
                if(signal(SIGUSR2, process_cap2) == SIG_ERR) {
                    cout << "error";
                }

                cout << "创建子进程——2成功";
                childPid_2 = getpid();
                cout << "  ppid  " << getppid() << "  pid  " << getpid()
                     << endl;
                /*执行子进程-2操作**/
                while(j) {
                    /*
                    read(pfd[0], buf, 1024);
                    cout << buf << endl;
                    */
                    size_t nbytes = read(pfd[0], buf, 1024);
                    cout << std::string(buf, buf + nbytes) << endl;
                    sleep(1);
                    if(j == false) {
                        break;
                    }
                }

                cout << "Child Process 2 is killed by Parent!" << endl;
                exit(0);

            } else {
                /*执行来自用户的操作 ctrl+c */
                signal(SIGINT, cap);

                while(true)
                    ;
            }
        }
    }
}

void cap(int signum) {
    cout << getpid() << "进程"
         << "捕捉到SIGINT信号" << endl;
    kill(childPid_1, SIGUSR1);
    waitpid(childPid_1, NULL, 0);

    kill(childPid_2, SIGUSR2);
    waitpid(childPid_2, NULL, 0);

    cout << "Parent Process is killed";
    signal(SIGINT, SIG_DFL);
}

void process_cap1(int signum) {

    cout << getpid() << "进程"
         << "捕捉到SIGUSR1信号" << endl;
    //将 i 设置为负数 退出while
    i = -1;
}

void process_cap2(int signum) {
    cout << j;
    j = false;
    cout << getpid() << "进程"
         << "捕捉到SIGUSR2信号" << endl;
    cout << j;
    return;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-15 08:40:56 | 显示全部楼层

回帖奖励 +5 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-15 15:52:32 | 显示全部楼层

回帖奖励 +5 鱼币

路过
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-29 09:23:14 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-15 01:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表