!396 修复signal中的关于pipe部分的用例问题
Merge pull request !396 from phchang/fix_pipebug
This commit is contained in:
commit
78a50aff99
|
@ -46,7 +46,7 @@ static UINT32 Testcase(VOID)
|
|||
ret = pipe(pipeFd[i]);
|
||||
ICUNIT_GOTO_EQUAL(ret, 0, ret, EXIT);
|
||||
fdmax = pipeFd[i][1] > fdmax ? pipeFd[i][1] : fdmax;
|
||||
ret = write(pipeFd[i][1], "hello world", TAR_STR_LEN);
|
||||
ret = write(pipeFd[i][1], "aloha world", TAR_STR_LEN);
|
||||
printf("write first status: %d\n", ret);
|
||||
ICUNIT_GOTO_EQUAL(ret, TAR_STR_LEN, ret, EXIT);
|
||||
}
|
||||
|
|
|
@ -49,7 +49,7 @@ static UINT32 Testcase(VOID)
|
|||
ICUNIT_GOTO_EQUAL(ret, 0, ret, EXIT);
|
||||
fdmax = pipeFd[i][1] > fdmax ? pipeFd[i][1] : fdmax;
|
||||
fdmax = pipeFd[i][0] > fdmax ? pipeFd[i][0] : fdmax;
|
||||
ret = write(pipeFd[i][1], "hello world", TAR_STR_LEN);
|
||||
ret = write(pipeFd[i][1], "Aloha World", TAR_STR_LEN);
|
||||
printf("write first status: %d\n", ret);
|
||||
ICUNIT_GOTO_EQUAL(ret, TAR_STR_LEN, ret, EXIT);
|
||||
}
|
||||
|
|
|
@ -48,7 +48,7 @@ static UINT32 Testcase(VOID)
|
|||
ret = pipe(pipeFd[i]);
|
||||
ICUNIT_GOTO_EQUAL(ret, 0, ret, EXIT);
|
||||
fdmax = pipeFd[i][1] > fdmax ? pipeFd[i][1] : fdmax;
|
||||
ret = write(pipeFd[i][1], "hello world", TAR_STR_LEN);
|
||||
ret = write(pipeFd[i][1], "Aloha world", TAR_STR_LEN);
|
||||
printf("write first status: %d\n", ret);
|
||||
ICUNIT_GOTO_EQUAL(ret, TAR_STR_LEN, ret, EXIT);
|
||||
}
|
||||
|
|
|
@ -29,28 +29,41 @@
|
|||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
#include "it_test_signal.h"
|
||||
|
||||
#include "sys/shm.h"
|
||||
|
||||
static UINT32 Testcase(VOID)
|
||||
{
|
||||
int pipeFd[2], ret, spid; // 2, pipe return 2 file descripter
|
||||
char buffer[20]; // 20, target buffer size
|
||||
int *sharedflag = NULL;
|
||||
int shmid;
|
||||
|
||||
ret = pipe(pipeFd);
|
||||
ICUNIT_GOTO_EQUAL(ret, 0, ret, EXIT1);
|
||||
shmid = shmget((key_t)IPC_PRIVATE, sizeof(int), 0666 | IPC_CREAT); // 0666 the authority of the shm
|
||||
ICUNIT_ASSERT_NOT_EQUAL(shmid, -1, shmid);
|
||||
sharedflag = (int *)shmat(shmid, NULL, 0);
|
||||
*sharedflag = 0;
|
||||
|
||||
spid = fork();
|
||||
ICUNIT_GOTO_NOT_EQUAL(spid, -1, spid, EXIT1);
|
||||
if (spid == 0) {
|
||||
sharedflag = (int *)shmat(shmid, NULL, 0);
|
||||
close(pipeFd[0]);
|
||||
sleep(10); // 10, sleep 10 second.
|
||||
ret = write(pipeFd[1], "hello world", 12); // 12, "hello world" length and '\0'
|
||||
printf("write first status: %d\n", ret);
|
||||
if (ret != 12) { // 12, "hello world" length and '\0'
|
||||
exit(11); // 11, the value of son process unexpect exit, convenient to debug
|
||||
}
|
||||
*sharedflag = 1;
|
||||
close(pipeFd[1]);
|
||||
exit(RED_FLAG);
|
||||
}
|
||||
close(pipeFd[1]);
|
||||
// waitting for the sub process has written the sentence
|
||||
while (*sharedflag != 1) {
|
||||
usleep(1);
|
||||
}
|
||||
ret = read(pipeFd[0], buffer, 12); // 12, "hello world" length and '\0'
|
||||
ICUNIT_GOTO_EQUAL(ret, 12, ret, EXIT); // 12, "hello world" length and '\0'
|
||||
ret = strcmp(buffer, "hello world");
|
||||
|
|
|
@ -29,7 +29,7 @@
|
|||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
#include "it_test_signal.h"
|
||||
|
||||
#include "sys/shm.h"
|
||||
|
||||
static const int TAR_STR_LEN = 12;
|
||||
|
||||
|
@ -37,25 +37,38 @@ static UINT32 Testcase(VOID)
|
|||
{
|
||||
int pipeFd[2], ret, spid; // 2, pipe return 2 file descripter
|
||||
char buffer[20]; // 20, target buffer size
|
||||
int *sharedflag = NULL;
|
||||
int shmid;
|
||||
|
||||
ret = pipe(pipeFd);
|
||||
ICUNIT_GOTO_EQUAL(ret, 0, ret, EXIT1);
|
||||
shmid = shmget((key_t)IPC_PRIVATE, sizeof(int), 0666 | IPC_CREAT); // 0666 the authority of the shm
|
||||
ICUNIT_ASSERT_NOT_EQUAL(shmid, -1, shmid);
|
||||
sharedflag = (int *)shmat(shmid, NULL, 0);
|
||||
*sharedflag = 0;
|
||||
|
||||
spid = fork();
|
||||
ICUNIT_GOTO_NOT_EQUAL(spid, -1, spid, EXIT1);
|
||||
if (spid == 0) {
|
||||
sharedflag = (int *)shmat(shmid, NULL, 0);
|
||||
close(pipeFd[0]);
|
||||
ret = write(pipeFd[1], "hello world", TAR_STR_LEN);
|
||||
ret = write(pipeFd[1], "Hello world", TAR_STR_LEN);
|
||||
printf("write first status: %d\n", ret);
|
||||
if (ret != TAR_STR_LEN) {
|
||||
exit(11); // 11, the value of son process unexpect exit, convenient to debug
|
||||
}
|
||||
*sharedflag = 1;
|
||||
close(pipeFd[1]);
|
||||
exit(RED_FLAG);
|
||||
}
|
||||
close(pipeFd[1]);
|
||||
sleep(2); // 2, sleep 2 second
|
||||
// waitting for the sub process has written the sentence
|
||||
while (*sharedflag != 1) {
|
||||
usleep(1);
|
||||
}
|
||||
ret = read(pipeFd[0], buffer, TAR_STR_LEN);
|
||||
ICUNIT_GOTO_EQUAL(ret, TAR_STR_LEN, ret, EXIT);
|
||||
ret = strcmp(buffer, "hello world");
|
||||
ret = strcmp(buffer, "Hello world");
|
||||
ICUNIT_GOTO_EQUAL(ret, 0, ret, EXIT);
|
||||
printf("read pipe success: %s\n", buffer);
|
||||
wait(&ret);
|
||||
|
|
|
@ -28,6 +28,7 @@
|
|||
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
#include "sys/shm.h"
|
||||
#include "it_test_signal.h"
|
||||
#include "signal.h"
|
||||
|
||||
|
@ -41,58 +42,59 @@ static int PipecommonWrite()
|
|||
int pipefd[2]; // 2, array subscript
|
||||
pid_t pid;
|
||||
int retValue = -1;
|
||||
retValue = pipe(pipefd);
|
||||
ICUNIT_ASSERT_EQUAL(retValue, 0, retValue);
|
||||
|
||||
signal(SIGPIPE, SigPrint);
|
||||
|
||||
int *sharedflag = NULL;
|
||||
int shmid;
|
||||
int *readFd = &pipefd[0];
|
||||
int *writeFd = &pipefd[1];
|
||||
|
||||
char sentence[] = "Hello World";
|
||||
char readbuffer[100];
|
||||
int status, ret;
|
||||
|
||||
retValue = pipe(pipefd);
|
||||
ICUNIT_ASSERT_EQUAL(retValue, 0, retValue);
|
||||
if (signal(SIGPIPE, SigPrint) == SIG_ERR) {
|
||||
printf("signal error\n");
|
||||
}
|
||||
|
||||
shmid = shmget((key_t)IPC_PRIVATE, sizeof(int), 0666 | IPC_CREAT); // 0666 the authority of the shm
|
||||
ICUNIT_ASSERT_NOT_EQUAL(shmid, -1, shmid);
|
||||
sharedflag = (int *)shmat(shmid, NULL, 0);
|
||||
*sharedflag = 0;
|
||||
|
||||
pid = fork();
|
||||
if (pid == -1) {
|
||||
printf("Fork Error!\n");
|
||||
return -1;
|
||||
} else if (pid == 0) {
|
||||
for (int i = 0; i < 3; i++) { // 3, Number of cycles
|
||||
close(*readFd);
|
||||
retValue = write(*writeFd, sentence, strlen(sentence) + 1);
|
||||
|
||||
if (i == 0) {
|
||||
if (retValue != strlen(sentence) + 1) {
|
||||
exit(retValue);
|
||||
}
|
||||
} else {
|
||||
if (retValue != -1) {
|
||||
exit(retValue);
|
||||
}
|
||||
if (errno != EPIPE) {
|
||||
exit(errno);
|
||||
}
|
||||
}
|
||||
usleep(150000); // 150000, Used to calculate the delay time.
|
||||
sharedflag = (int *)shmat(shmid, NULL, 0);
|
||||
close(*readFd);
|
||||
retValue = write(*writeFd, sentence, strlen(sentence) + 1);
|
||||
ICUNIT_ASSERT_EQUAL(retValue, strlen(sentence) + 1, retValue);
|
||||
*sharedflag = 1;
|
||||
// 2 waitting for the father process close the pipe's read port
|
||||
while (*sharedflag != 2) {
|
||||
usleep(1);
|
||||
}
|
||||
retValue = write(*writeFd, sentence, strlen(sentence) + 1);
|
||||
ICUNIT_ASSERT_EQUAL(retValue, -1, retValue);
|
||||
ICUNIT_ASSERT_EQUAL(errno, EPIPE, errno);
|
||||
exit(0);
|
||||
} else {
|
||||
usleep(10000); // 10000, Used to calculate the delay time.
|
||||
for (int i = 0; i < 3; i++) { // 3, Number of cycles
|
||||
close(*readFd);
|
||||
close(*writeFd);
|
||||
// 1 waitting for the sub process has written the sentence first
|
||||
while (*sharedflag != 1) {
|
||||
usleep(1);
|
||||
}
|
||||
close(*readFd);
|
||||
// 2 father process close the pipe's read port
|
||||
*sharedflag = 2;
|
||||
ret = waitpid(pid, &status, 0);
|
||||
ICUNIT_ASSERT_EQUAL(ret, pid, ret);
|
||||
ICUNIT_ASSERT_EQUAL(WEXITSTATUS(status), 0, WEXITSTATUS(status));
|
||||
}
|
||||
|
||||
close(*readFd);
|
||||
close(*writeFd);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void ItPosixPipe005(void)
|
||||
{
|
||||
TEST_ADD_CASE(__FUNCTION__, PipecommonWrite, TEST_POSIX, TEST_MEM, TEST_LEVEL0, TEST_FUNCTION);
|
||||
|
|
|
@ -627,6 +627,17 @@ HWTEST_F(SignalTest, ItPosixPipe003, TestSize.Level0)
|
|||
ItPosixPipe003();
|
||||
}
|
||||
|
||||
/* *
|
||||
* @tc.name: ItPosixPipe004
|
||||
* @tc.desc: function for SignalTest
|
||||
* @tc.type: FUNC
|
||||
* @tc.require: AR000EEMQ9
|
||||
*/
|
||||
HWTEST_F(SignalTest, ItPosixPipe004, TestSize.Level0)
|
||||
{
|
||||
ItPosixPipe004();
|
||||
}
|
||||
|
||||
/* *
|
||||
* @tc.name: ItPosixPipe005
|
||||
* @tc.desc: function for SignalTest
|
||||
|
|
|
@ -39,7 +39,7 @@ static UINT32 Testcase(VOID)
|
|||
fd_set reads;
|
||||
ret = pipe(pipeFd);
|
||||
ICUNIT_GOTO_EQUAL(ret, 0, ret, EXIT);
|
||||
ret = write(pipeFd[1], "hello world", TAR_STR_LEN);
|
||||
ret = write(pipeFd[1], "Hello World", TAR_STR_LEN);
|
||||
printf("write first status: %d\n", ret);
|
||||
ICUNIT_GOTO_EQUAL(ret, TAR_STR_LEN, ret, EXIT);
|
||||
FD_ZERO(&reads);
|
||||
|
|
|
@ -31,6 +31,7 @@
|
|||
#include "it_test_signal.h"
|
||||
#include "signal.h"
|
||||
#include "fcntl.h"
|
||||
#include "sys/shm.h"
|
||||
|
||||
static int TestPipeMultiProcess()
|
||||
{
|
||||
|
@ -42,46 +43,62 @@ static int TestPipeMultiProcess()
|
|||
|
||||
int *readFd = &pipefd[0];
|
||||
int *writeFd = &pipefd[1];
|
||||
|
||||
char readbuffer[100];
|
||||
char readbuffer[100] = {0};
|
||||
int status, ret;
|
||||
int totalNum = 3;
|
||||
int *sharedflag = NULL;
|
||||
int shmid;
|
||||
|
||||
int flag = fcntl(*readFd, F_GETFL);
|
||||
fcntl(*readFd, F_SETFL, flag | O_NONBLOCK);
|
||||
shmid = shmget((key_t)IPC_PRIVATE, sizeof(int), 0666 | IPC_CREAT); // 0666 the authority of the shm
|
||||
ICUNIT_ASSERT_NOT_EQUAL(shmid, -1, shmid);
|
||||
sharedflag = (int *)shmat(shmid, NULL, 0);
|
||||
*sharedflag = 0;
|
||||
|
||||
pid = fork();
|
||||
if (pid == -1) {
|
||||
printf("Fork Error!\n");
|
||||
return -1;
|
||||
} else if (pid == 0) {
|
||||
sharedflag = (int *)shmat(shmid, NULL, 0);
|
||||
close(pipefd[0]);
|
||||
for (int i = 0; i < totalNum; i++) {
|
||||
errno = 0;
|
||||
char sentence1[15] = "Hello World";
|
||||
char a[4] = {0};
|
||||
char a[2] = {0};
|
||||
sprintf(a, "%d", i);
|
||||
strcat(sentence1, a);
|
||||
int ret = write(*writeFd, sentence1, strlen(sentence1) + 1);
|
||||
ICUNIT_ASSERT_EQUAL(ret, strlen(sentence1) + 1, ret);
|
||||
usleep(10000); // 10000, Used to calculate the delay time.
|
||||
}
|
||||
*sharedflag = 1;
|
||||
ret = close(pipefd[1]);
|
||||
ICUNIT_ASSERT_EQUAL(ret, 0, ret);
|
||||
exit(0);
|
||||
} else {
|
||||
close(pipefd[1]);
|
||||
// waitting for the sub process has written the sentence first
|
||||
while (*sharedflag != 1) {
|
||||
usleep(1);
|
||||
}
|
||||
for (int i = 0; i < totalNum; i++) {
|
||||
printf("read\n");
|
||||
char sentence1[15] = "Hello World";
|
||||
char a[4] = {0};
|
||||
char a[2] = {0};
|
||||
sprintf(a, "%d", i);
|
||||
strcat(sentence1, a);
|
||||
memset(readbuffer, 0, sizeof(readbuffer));
|
||||
retValue = read(*readFd, readbuffer, sizeof(readbuffer));
|
||||
printf("Receive %d bytes data : %s,%d\n", retValue, readbuffer, errno);
|
||||
ICUNIT_ASSERT_SIZE_STRING_EQUAL(readbuffer, readbuffer, strlen(sentence1), errno);
|
||||
retValue = read(*readFd, readbuffer, strlen(sentence1) + 1);
|
||||
printf("Receive %d bytes data : %s, errno : %d\n", retValue, readbuffer, errno);
|
||||
ICUNIT_ASSERT_SIZE_STRING_EQUAL(readbuffer, sentence1, strlen(sentence1), errno);
|
||||
}
|
||||
}
|
||||
ret = waitpid(pid, &status, 0);
|
||||
ICUNIT_ASSERT_EQUAL(ret, pid, ret);
|
||||
ret = close(pipefd[0]);
|
||||
ICUNIT_ASSERT_EQUAL(ret, 0, ret);
|
||||
ret = close(pipefd[1]);
|
||||
ICUNIT_ASSERT_EQUAL(ret, 0, ret);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue